{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "23R0Z9RojXYW"
   },
   "source": [
    "# Interacting with TFX Keras Components"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "KAD1tLoTm_QS"
   },
   "source": [
    "This notebook will interactively walk through each built-in component of TensorFlow Extended (TFX).\n",
    "\n",
    "It covers every step in an end-to-end machine learning pipeline, from data ingestion to pushing a model to serving.\n",
    "\n",
    "When you're done, the contents of this notebook can be automatically exported as TFX pipeline source code, which you can orchestrate with Apache Airflow and Apache Beam.\n",
    "\n",
    "Note: This notebook demonstrates the use of native Keras models in TFX pipelines. **TFX only supports the TensorFlow 2 version of Keras**.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Learning objectives\n",
    "\n",
    "* Set up pipeline paths.\n",
    "* Download example data.\n",
    "* Run TFX components interactively."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "sfSQ-kX-MLEr",
    "jp-MarkdownHeadingCollapsed": true,
    "tags": []
   },
   "source": [
    "## Introduction\n",
    "This notebook demonstrates how to use TFX in a Jupyter/Colab environment.  Here, you walk through the Chicago Taxi example in an interactive notebook.\n",
    "\n",
    "Working in an interactive notebook is a useful way to become familiar with the structure of a TFX pipeline.  It's also useful when doing development of your own pipelines as a lightweight development environment, but you should be aware that there are differences in the way interactive notebooks are orchestrated, and how they access metadata artifacts.\n",
    "\n",
    "### Orchestration\n",
    "\n",
    "In a production deployment of TFX, you will use an orchestrator such as Apache Airflow, Kubeflow Pipelines, or Apache Beam to orchestrate a pre-defined pipeline graph of TFX components.  In an interactive notebook, the notebook itself is the orchestrator, running each TFX component as you execute the notebook cells.\n",
    "\n",
    "### Metadata\n",
    "\n",
    "In a production deployment of TFX, you will access metadata through the ML Metadata (MLMD) API.  MLMD stores metadata properties in a database such as MySQL or SQLite, and stores the metadata payloads in a persistent store such as on your filesystem.  In an interactive notebook, both properties and payloads are stored in an ephemeral SQLite database in the `/tmp` directory on the Jupyter notebook or Colab server."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "2GivNBNYjb3b"
   },
   "source": [
    "## Setup\n",
    "First, you install and import the necessary packages, set up paths, and download data.\n",
    "\n",
    "Each learning objective will correspond to a __#TODO__ in the [student lab notebook](../labs/components_keras.ipynb) -- try to complete that notebook first before reviewing this solution notebook. \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Fmgi8ZvQkScg"
   },
   "source": [
    "### Upgrade Pip\n",
    "\n",
    "To avoid upgrading Pip in a system when running locally, check to make sure that you're running in Colab.  Local systems can of course be upgraded separately."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "id": "as4OTe2ukSqm"
   },
   "outputs": [],
   "source": [
    "import sys\n",
    "if 'google.colab' in sys.modules:\n",
    "  !pip install --upgrade pip"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "MZOYTt1RW4TK"
   },
   "source": [
    "### Install TFX\n",
    "\n",
    "**Note: In Google Colab, because of package updates, the first time you run this cell you must restart the runtime (Runtime > Restart runtime ...).**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "id": "S4SQA7Q5nej3"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting tfx\n",
      "  Downloading tfx-1.7.1-py3-none-any.whl (2.5 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.5/2.5 MB\u001b[0m \u001b[31m35.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
      "\u001b[?25hCollecting click<8,>=7\n",
      "  Downloading click-7.1.2-py2.py3-none-any.whl (82 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m82.8/82.8 KB\u001b[0m \u001b[31m8.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: tensorflow-transform<1.8.0,>=1.7.0 in /opt/conda/lib/python3.7/site-packages (from tfx) (1.7.0)\n",
      "Requirement already satisfied: protobuf<4,>=3.13 in /opt/conda/lib/python3.7/site-packages (from tfx) (3.19.4)\n",
      "Collecting docker<5,>=4.1\n",
      "  Downloading docker-4.4.4-py2.py3-none-any.whl (147 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m147.0/147.0 KB\u001b[0m \u001b[31m14.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: google-cloud-bigquery<3,>=2.26.0 in /opt/conda/lib/python3.7/site-packages (from tfx) (2.34.2)\n",
      "Collecting attrs<21,>=19.3.0\n",
      "  Downloading attrs-20.3.0-py2.py3-none-any.whl (49 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m49.3/49.3 KB\u001b[0m \u001b[31m5.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting pyyaml<6,>=3.12\n",
      "  Downloading PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl (636 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m636.6/636.6 KB\u001b[0m \u001b[31m30.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting ml-metadata<1.8.0,>=1.7.0\n",
      "  Downloading ml_metadata-1.7.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.6 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.6/6.6 MB\u001b[0m \u001b[31m62.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m0:01\u001b[0m\n",
      "\u001b[?25hCollecting google-api-python-client<2,>=1.8\n",
      "  Downloading google_api_python_client-1.12.11-py2.py3-none-any.whl (62 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.1/62.1 KB\u001b[0m \u001b[31m5.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting tensorflow!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,<2.9,>=1.15.5\n",
      "  Downloading tensorflow-2.8.0-cp37-cp37m-manylinux2010_x86_64.whl (497.5 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m497.5/497.5 MB\u001b[0m \u001b[31m1.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hCollecting ml-pipelines-sdk==1.7.1\n",
      "  Downloading ml_pipelines_sdk-1.7.1-py3-none-any.whl (1.3 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m53.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting tensorflow-data-validation<1.8.0,>=1.7.0\n",
      "  Downloading tensorflow_data_validation-1.7.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.4 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.4/1.4 MB\u001b[0m \u001b[31m58.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: tfx-bsl<1.8.0,>=1.7.0 in /opt/conda/lib/python3.7/site-packages (from tfx) (1.7.0)\n",
      "Requirement already satisfied: numpy<2,>=1.16 in /opt/conda/lib/python3.7/site-packages (from tfx) (1.19.5)\n",
      "Requirement already satisfied: google-apitools<1,>=0.5 in /opt/conda/lib/python3.7/site-packages (from tfx) (0.5.31)\n",
      "Collecting packaging<21,>=20\n",
      "  Downloading packaging-20.9-py2.py3-none-any.whl (40 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m40.9/40.9 KB\u001b[0m \u001b[31m4.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: grpcio<2,>=1.28.1 in /opt/conda/lib/python3.7/site-packages (from tfx) (1.44.0)\n",
      "Collecting portpicker<2,>=1.3.1\n",
      "  Downloading portpicker-1.5.0-py3-none-any.whl (14 kB)\n",
      "Requirement already satisfied: tensorflow-hub<0.13,>=0.9.0 in /opt/conda/lib/python3.7/site-packages (from tfx) (0.12.0)\n",
      "Collecting kubernetes<13,>=10.0.1\n",
      "  Downloading kubernetes-12.0.1-py2.py3-none-any.whl (1.7 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.7/1.7 MB\u001b[0m \u001b[31m57.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: absl-py<2.0.0,>=0.9 in /opt/conda/lib/python3.7/site-packages (from tfx) (0.15.0)\n",
      "Requirement already satisfied: tensorflow-serving-api!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,<3,>=1.15 in /opt/conda/lib/python3.7/site-packages (from tfx) (2.8.0)\n",
      "Requirement already satisfied: keras-tuner<2,>=1.0.4 in /opt/conda/lib/python3.7/site-packages (from tfx) (1.1.0)\n",
      "Collecting tensorflow-model-analysis<0.39,>=0.38.0\n",
      "  Downloading tensorflow_model_analysis-0.38.0-py3-none-any.whl (1.8 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.8/1.8 MB\u001b[0m \u001b[31m65.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting pyarrow<6,>=1\n",
      "  Downloading pyarrow-5.0.0-cp37-cp37m-manylinux2014_x86_64.whl (23.6 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m23.6/23.6 MB\u001b[0m \u001b[31m41.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: apache-beam[gcp]<3,>=2.36 in /opt/conda/lib/python3.7/site-packages (from tfx) (2.37.0)\n",
      "Requirement already satisfied: jinja2<4,>=2.7.3 in /opt/conda/lib/python3.7/site-packages (from tfx) (2.11.3)\n",
      "Requirement already satisfied: google-cloud-aiplatform<2,>=1.6.2 in /opt/conda/lib/python3.7/site-packages (from tfx) (1.11.0)\n",
      "Requirement already satisfied: six in /opt/conda/lib/python3.7/site-packages (from absl-py<2.0.0,>=0.9->tfx) (1.15.0)\n",
      "Requirement already satisfied: python-dateutil<3,>=2.8.0 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (2.8.2)\n",
      "Requirement already satisfied: crcmod<2.0,>=1.7 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (1.7)\n",
      "Requirement already satisfied: cloudpickle<3,>=2.0.0 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (2.0.0)\n",
      "Requirement already satisfied: oauth2client<5,>=2.0.1 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (4.1.3)\n",
      "Collecting dill<0.3.2,>=0.3.1.1\n",
      "  Downloading dill-0.3.1.1.tar.gz (151 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m152.0/152.0 KB\u001b[0m \u001b[31m17.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Preparing metadata (setup.py) ... \u001b[?25ldone\n",
      "\u001b[?25hRequirement already satisfied: orjson<4.0 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (3.6.7)\n",
      "Requirement already satisfied: proto-plus<2,>=1.7.1 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (1.20.3)\n",
      "Requirement already satisfied: typing-extensions>=3.7.0 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (3.10.0.2)\n",
      "Requirement already satisfied: pytz>=2018.3 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (2021.3)\n",
      "Collecting httplib2<0.20.0,>=0.8\n",
      "  Downloading httplib2-0.19.1-py3-none-any.whl (95 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m95.4/95.4 KB\u001b[0m \u001b[31m10.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: pymongo<4.0.0,>=3.8.0 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (3.12.3)\n",
      "Requirement already satisfied: requests<3.0.0,>=2.24.0 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (2.27.1)\n",
      "Requirement already satisfied: hdfs<3.0.0,>=2.1.0 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (2.6.0)\n",
      "Requirement already satisfied: pydot<2,>=1.2.0 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (1.4.2)\n",
      "Requirement already satisfied: fastavro<2,>=0.23.6 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (1.4.10)\n",
      "Requirement already satisfied: google-cloud-recommendations-ai<=0.2.0,>=0.1.0 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (0.2.0)\n",
      "Requirement already satisfied: google-auth<3,>=1.18.0 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (1.35.0)\n",
      "Collecting google-cloud-vision<2,>=0.38.0\n",
      "  Downloading google_cloud_vision-1.0.1-py2.py3-none-any.whl (435 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m435.1/435.1 KB\u001b[0m \u001b[31m30.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: google-cloud-bigquery-storage>=2.6.3 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (2.13.0)\n",
      "Collecting google-cloud-spanner<2,>=1.13.0\n",
      "  Downloading google_cloud_spanner-1.19.2-py2.py3-none-any.whl (255 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m255.5/255.5 KB\u001b[0m \u001b[31m2.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: google-cloud-pubsub<3,>=2.1.0 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (2.11.0)\n",
      "Requirement already satisfied: cachetools<5,>=3.1.0 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (4.2.4)\n",
      "Collecting google-cloud-videointelligence<2,>=1.8.0\n",
      "  Downloading google_cloud_videointelligence-1.16.2-py2.py3-none-any.whl (183 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m183.9/183.9 KB\u001b[0m \u001b[31m810.5 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: google-cloud-dlp<4,>=3.0.0 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (3.6.2)\n",
      "Requirement already satisfied: grpcio-gcp<1,>=0.2.2 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (0.2.2)\n",
      "Collecting google-cloud-bigtable<2,>=0.31.1\n",
      "  Downloading google_cloud_bigtable-1.7.1-py2.py3-none-any.whl (267 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m267.7/267.7 KB\u001b[0m \u001b[31m1.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hCollecting google-cloud-datastore<2,>=1.8.0\n",
      "  Downloading google_cloud_datastore-1.15.4-py2.py3-none-any.whl (134 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m134.2/134.2 KB\u001b[0m \u001b[31m1.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: google-cloud-pubsublite<2,>=1.2.0 in /opt/conda/lib/python3.7/site-packages (from apache-beam[gcp]<3,>=2.36->tfx) (1.4.1)\n",
      "Collecting google-cloud-core<2,>=0.28.1\n",
      "  Downloading google_cloud_core-1.7.2-py2.py3-none-any.whl (28 kB)\n",
      "Collecting google-cloud-language<2,>=1.3.0\n",
      "  Downloading google_cloud_language-1.3.1-py2.py3-none-any.whl (83 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m83.6/83.6 KB\u001b[0m \u001b[31m182.4 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: websocket-client>=0.32.0 in /opt/conda/lib/python3.7/site-packages (from docker<5,>=4.1->tfx) (1.3.1)\n",
      "Requirement already satisfied: google-auth-httplib2>=0.0.3 in /opt/conda/lib/python3.7/site-packages (from google-api-python-client<2,>=1.8->tfx) (0.1.0)\n",
      "Collecting uritemplate<4dev,>=3.0.0\n",
      "  Downloading uritemplate-3.0.1-py2.py3-none-any.whl (15 kB)\n",
      "Requirement already satisfied: google-api-core<3dev,>=1.21.0 in /opt/conda/lib/python3.7/site-packages (from google-api-python-client<2,>=1.8->tfx) (2.5.0)\n",
      "Requirement already satisfied: fasteners>=0.14 in /opt/conda/lib/python3.7/site-packages (from google-apitools<1,>=0.5->tfx) (0.17.3)\n",
      "Requirement already satisfied: google-cloud-storage<3.0.0dev,>=1.32.0 in /opt/conda/lib/python3.7/site-packages (from google-cloud-aiplatform<2,>=1.6.2->tfx) (2.2.1)\n",
      "Requirement already satisfied: google-resumable-media<3.0dev,>=0.6.0 in /opt/conda/lib/python3.7/site-packages (from google-cloud-bigquery<3,>=2.26.0->tfx) (2.3.2)\n",
      "Requirement already satisfied: MarkupSafe>=0.23 in /opt/conda/lib/python3.7/site-packages (from jinja2<4,>=2.7.3->tfx) (2.0.1)\n",
      "Requirement already satisfied: ipython in /opt/conda/lib/python3.7/site-packages (from keras-tuner<2,>=1.0.4->tfx) (7.32.0)\n",
      "Requirement already satisfied: scipy in /opt/conda/lib/python3.7/site-packages (from keras-tuner<2,>=1.0.4->tfx) (1.7.3)\n",
      "Requirement already satisfied: tensorboard in /opt/conda/lib/python3.7/site-packages (from keras-tuner<2,>=1.0.4->tfx) (2.6.0)\n",
      "Requirement already satisfied: kt-legacy in /opt/conda/lib/python3.7/site-packages (from keras-tuner<2,>=1.0.4->tfx) (1.0.4)\n",
      "Requirement already satisfied: requests-oauthlib in /opt/conda/lib/python3.7/site-packages (from kubernetes<13,>=10.0.1->tfx) (1.3.1)\n",
      "Requirement already satisfied: certifi>=14.05.14 in /opt/conda/lib/python3.7/site-packages (from kubernetes<13,>=10.0.1->tfx) (2021.10.8)\n",
      "Requirement already satisfied: setuptools>=21.0.0 in /opt/conda/lib/python3.7/site-packages (from kubernetes<13,>=10.0.1->tfx) (59.8.0)\n",
      "Requirement already satisfied: urllib3>=1.24.2 in /opt/conda/lib/python3.7/site-packages (from kubernetes<13,>=10.0.1->tfx) (1.26.8)\n",
      "Requirement already satisfied: pyparsing>=2.0.2 in /opt/conda/lib/python3.7/site-packages (from packaging<21,>=20->tfx) (3.0.7)\n",
      "Requirement already satisfied: psutil in /opt/conda/lib/python3.7/site-packages (from portpicker<2,>=1.3.1->tfx) (5.9.0)\n",
      "Requirement already satisfied: keras-preprocessing>=1.1.1 in /opt/conda/lib/python3.7/site-packages (from tensorflow!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,<2.9,>=1.15.5->tfx) (1.1.2)\n",
      "Requirement already satisfied: wrapt>=1.11.0 in /opt/conda/lib/python3.7/site-packages (from tensorflow!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,<2.9,>=1.15.5->tfx) (1.12.1)\n",
      "Requirement already satisfied: astunparse>=1.6.0 in /opt/conda/lib/python3.7/site-packages (from tensorflow!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,<2.9,>=1.15.5->tfx) (1.6.3)\n",
      "Requirement already satisfied: h5py>=2.9.0 in /opt/conda/lib/python3.7/site-packages (from tensorflow!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,<2.9,>=1.15.5->tfx) (3.1.0)\n",
      "Collecting numpy<2,>=1.16\n",
      "  Downloading numpy-1.21.6-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (15.7 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m15.7/15.7 MB\u001b[0m \u001b[31m17.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hCollecting tensorboard\n",
      "  Downloading tensorboard-2.8.0-py3-none-any.whl (5.8 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.8/5.8 MB\u001b[0m \u001b[31m76.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: termcolor>=1.1.0 in /opt/conda/lib/python3.7/site-packages (from tensorflow!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,<2.9,>=1.15.5->tfx) (1.1.0)\n",
      "Requirement already satisfied: opt-einsum>=2.3.2 in /opt/conda/lib/python3.7/site-packages (from tensorflow!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,<2.9,>=1.15.5->tfx) (3.3.0)\n",
      "Requirement already satisfied: google-pasta>=0.1.1 in /opt/conda/lib/python3.7/site-packages (from tensorflow!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,<2.9,>=1.15.5->tfx) (0.2.0)\n",
      "Collecting libclang>=9.0.1\n",
      "  Downloading libclang-14.0.1-py2.py3-none-manylinux1_x86_64.whl (14.5 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m14.5/14.5 MB\u001b[0m \u001b[31m63.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: gast>=0.2.1 in /opt/conda/lib/python3.7/site-packages (from tensorflow!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,<2.9,>=1.15.5->tfx) (0.4.0)\n",
      "Collecting keras<2.9,>=2.8.0rc0\n",
      "  Downloading keras-2.8.0-py2.py3-none-any.whl (1.4 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.4/1.4 MB\u001b[0m \u001b[31m65.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: flatbuffers>=1.12 in /opt/conda/lib/python3.7/site-packages (from tensorflow!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,<2.9,>=1.15.5->tfx) (1.12)\n",
      "Collecting tensorflow-io-gcs-filesystem>=0.23.1\n",
      "  Downloading tensorflow_io_gcs_filesystem-0.25.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (2.1 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.1/2.1 MB\u001b[0m \u001b[31m76.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting tf-estimator-nightly==2.8.0.dev2021122109\n",
      "  Downloading tf_estimator_nightly-2.8.0.dev2021122109-py2.py3-none-any.whl (462 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m462.5/462.5 KB\u001b[0m \u001b[31m12.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: tensorflow-metadata<1.8,>=1.7.0 in /opt/conda/lib/python3.7/site-packages (from tensorflow-data-validation<1.8.0,>=1.7.0->tfx) (1.7.0)\n",
      "Collecting joblib<0.15,>=0.12\n",
      "  Downloading joblib-0.14.1-py2.py3-none-any.whl (294 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m294.9/294.9 KB\u001b[0m \u001b[31m24.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting pyfarmhash<0.4,>=0.2\n",
      "  Downloading pyfarmhash-0.3.2.tar.gz (99 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m99.9/99.9 KB\u001b[0m \u001b[31m13.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Preparing metadata (setup.py) ... \u001b[?25ldone\n",
      "\u001b[?25hRequirement already satisfied: pandas<2,>=1.0 in /opt/conda/lib/python3.7/site-packages (from tensorflow-data-validation<1.8.0,>=1.7.0->tfx) (1.3.5)\n",
      "Requirement already satisfied: ipywidgets<8,>=7 in /opt/conda/lib/python3.7/site-packages (from tensorflow-model-analysis<0.39,>=0.38.0->tfx) (7.6.5)\n",
      "Requirement already satisfied: wheel<1.0,>=0.23.0 in /opt/conda/lib/python3.7/site-packages (from astunparse>=1.6.0->tensorflow!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,<2.9,>=1.15.5->tfx) (0.37.1)\n",
      "Requirement already satisfied: googleapis-common-protos<2.0dev,>=1.52.0 in /opt/conda/lib/python3.7/site-packages (from google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.8->tfx) (1.54.0)\n",
      "Requirement already satisfied: grpcio-status<2.0dev,>=1.33.2 in /opt/conda/lib/python3.7/site-packages (from google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.8->tfx) (1.44.0)\n",
      "Requirement already satisfied: pyasn1-modules>=0.2.1 in /opt/conda/lib/python3.7/site-packages (from google-auth<3,>=1.18.0->apache-beam[gcp]<3,>=2.36->tfx) (0.2.7)\n",
      "Requirement already satisfied: rsa<5,>=3.1.4 in /opt/conda/lib/python3.7/site-packages (from google-auth<3,>=1.18.0->apache-beam[gcp]<3,>=2.36->tfx) (4.8)\n",
      "Requirement already satisfied: grpc-google-iam-v1<0.13dev,>=0.12.3 in /opt/conda/lib/python3.7/site-packages (from google-cloud-bigtable<2,>=0.31.1->apache-beam[gcp]<3,>=2.36->tfx) (0.12.3)\n",
      "Collecting google-cloud-core<2,>=0.28.1\n",
      "  Downloading google_cloud_core-1.7.1-py2.py3-none-any.whl (28 kB)\n",
      "  Downloading google_cloud_core-1.7.0-py2.py3-none-any.whl (28 kB)\n",
      "  Downloading google_cloud_core-1.6.0-py2.py3-none-any.whl (28 kB)\n",
      "  Downloading google_cloud_core-1.5.0-py2.py3-none-any.whl (27 kB)\n",
      "  Downloading google_cloud_core-1.4.4-py2.py3-none-any.whl (27 kB)\n",
      "  Downloading google_cloud_core-1.4.3-py2.py3-none-any.whl (27 kB)\n",
      "  Downloading google_cloud_core-1.4.2-py2.py3-none-any.whl (26 kB)\n",
      "  Downloading google_cloud_core-1.4.1-py2.py3-none-any.whl (26 kB)\n",
      "INFO: pip is looking at multiple versions of google-cloud-bigtable to determine which version is compatible with other requirements. This could take a while.\n",
      "Collecting google-cloud-bigtable<2,>=0.31.1\n",
      "  Downloading google_cloud_bigtable-1.7.0-py2.py3-none-any.whl (267 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m267.7/267.7 KB\u001b[0m \u001b[31m19.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hINFO: pip is looking at multiple versions of google-cloud-bigquery-storage to determine which version is compatible with other requirements. This could take a while.\n",
      "Collecting google-cloud-bigquery-storage>=2.6.3\n",
      "  Downloading google_cloud_bigquery_storage-2.13.1-py2.py3-none-any.whl (180 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m180.1/180.1 KB\u001b[0m \u001b[31m12.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hINFO: pip is looking at multiple versions of google-auth-httplib2 to determine which version is compatible with other requirements. This could take a while.\n",
      "Collecting google-auth-httplib2>=0.0.3\n",
      "  Downloading google_auth_httplib2-0.1.0-py2.py3-none-any.whl (9.3 kB)\n",
      "INFO: pip is looking at multiple versions of google-auth to determine which version is compatible with other requirements. This could take a while.\n",
      "Collecting google-auth<3,>=1.18.0\n",
      "  Downloading google_auth-2.6.6-py2.py3-none-any.whl (156 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m156.7/156.7 KB\u001b[0m \u001b[31m7.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Downloading google_auth-1.35.0-py2.py3-none-any.whl (152 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m152.9/152.9 KB\u001b[0m \u001b[31m7.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hINFO: pip is looking at multiple versions of google-api-core[grpc] to determine which version is compatible with other requirements. This could take a while.\n",
      "Collecting google-api-core[grpc]!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0,<3.0.0dev,>=1.31.5\n",
      "  Downloading google_api_core-2.7.3-py3-none-any.whl (114 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.6/114.6 KB\u001b[0m \u001b[31m6.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hINFO: pip is looking at multiple versions of google-api-core to determine which version is compatible with other requirements. This could take a while.\n",
      "  Downloading google_api_core-2.7.2-py3-none-any.whl (114 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.6/114.6 KB\u001b[0m \u001b[31m16.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Downloading google_api_core-2.7.1-py3-none-any.whl (114 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.7/114.7 KB\u001b[0m \u001b[31m14.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Downloading google_api_core-2.7.0-py3-none-any.whl (114 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.7/114.7 KB\u001b[0m \u001b[31m4.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Downloading google_api_core-2.6.1-py3-none-any.whl (114 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.6/114.6 KB\u001b[0m \u001b[31m5.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Downloading google_api_core-2.6.0-py2.py3-none-any.whl (114 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.6/114.6 KB\u001b[0m \u001b[31m6.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Downloading google_api_core-2.5.0-py2.py3-none-any.whl (111 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m111.8/111.8 KB\u001b[0m \u001b[31m132.5 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
      "\u001b[?25hINFO: pip is looking at multiple versions of google-api-core[grpc] to determine which version is compatible with other requirements. This could take a while.\n",
      "  Downloading google_api_core-2.4.0-py2.py3-none-any.whl (111 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m111.7/111.7 KB\u001b[0m \u001b[31m9.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hINFO: pip is looking at multiple versions of google-api-core to determine which version is compatible with other requirements. This could take a while.\n",
      "  Downloading google_api_core-2.3.2-py2.py3-none-any.whl (109 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m109.8/109.8 KB\u001b[0m \u001b[31m9.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Downloading google_api_core-1.31.5-py2.py3-none-any.whl (93 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m93.3/93.3 KB\u001b[0m \u001b[31m9.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: overrides<7.0.0,>=6.0.1 in /opt/conda/lib/python3.7/site-packages (from google-cloud-pubsublite<2,>=1.2.0->apache-beam[gcp]<3,>=2.36->tfx) (6.1.0)\n",
      "Requirement already satisfied: google-crc32c<2.0dev,>=1.0 in /opt/conda/lib/python3.7/site-packages (from google-resumable-media<3.0dev,>=0.6.0->google-cloud-bigquery<3,>=2.26.0->tfx) (1.1.2)\n",
      "Requirement already satisfied: cached-property in /opt/conda/lib/python3.7/site-packages (from h5py>=2.9.0->tensorflow!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,<2.9,>=1.15.5->tfx) (1.5.2)\n",
      "Requirement already satisfied: docopt in /opt/conda/lib/python3.7/site-packages (from hdfs<3.0.0,>=2.1.0->apache-beam[gcp]<3,>=2.36->tfx) (0.6.2)\n",
      "Collecting pyparsing>=2.0.2\n",
      "  Downloading pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m67.8/67.8 KB\u001b[0m \u001b[31m3.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: pickleshare in /opt/conda/lib/python3.7/site-packages (from ipython->keras-tuner<2,>=1.0.4->tfx) (0.7.5)\n",
      "Requirement already satisfied: pygments in /opt/conda/lib/python3.7/site-packages (from ipython->keras-tuner<2,>=1.0.4->tfx) (2.11.2)\n",
      "Requirement already satisfied: matplotlib-inline in /opt/conda/lib/python3.7/site-packages (from ipython->keras-tuner<2,>=1.0.4->tfx) (0.1.3)\n",
      "Requirement already satisfied: decorator in /opt/conda/lib/python3.7/site-packages (from ipython->keras-tuner<2,>=1.0.4->tfx) (5.1.1)\n",
      "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.7/site-packages (from ipython->keras-tuner<2,>=1.0.4->tfx) (4.8.0)\n",
      "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /opt/conda/lib/python3.7/site-packages (from ipython->keras-tuner<2,>=1.0.4->tfx) (3.0.27)\n",
      "Requirement already satisfied: traitlets>=4.2 in /opt/conda/lib/python3.7/site-packages (from ipython->keras-tuner<2,>=1.0.4->tfx) (5.1.1)\n",
      "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.7/site-packages (from ipython->keras-tuner<2,>=1.0.4->tfx) (0.18.1)\n",
      "Requirement already satisfied: backcall in /opt/conda/lib/python3.7/site-packages (from ipython->keras-tuner<2,>=1.0.4->tfx) (0.2.0)\n",
      "Requirement already satisfied: ipykernel>=4.5.1 in /opt/conda/lib/python3.7/site-packages (from ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (6.9.2)\n",
      "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /opt/conda/lib/python3.7/site-packages (from ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (1.0.2)\n",
      "Requirement already satisfied: ipython-genutils~=0.2.0 in /opt/conda/lib/python3.7/site-packages (from ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (0.2.0)\n",
      "Requirement already satisfied: nbformat>=4.2.0 in /opt/conda/lib/python3.7/site-packages (from ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (5.2.0)\n",
      "Requirement already satisfied: widgetsnbextension~=3.5.0 in /opt/conda/lib/python3.7/site-packages (from ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (3.5.2)\n",
      "Requirement already satisfied: pyasn1>=0.1.7 in /opt/conda/lib/python3.7/site-packages (from oauth2client<5,>=2.0.1->apache-beam[gcp]<3,>=2.36->tfx) (0.4.8)\n",
      "Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.7/site-packages (from requests<3.0.0,>=2.24.0->apache-beam[gcp]<3,>=2.36->tfx) (3.3)\n",
      "Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.7/site-packages (from requests<3.0.0,>=2.24.0->apache-beam[gcp]<3,>=2.36->tfx) (2.0.12)\n",
      "Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /opt/conda/lib/python3.7/site-packages (from tensorboard->keras-tuner<2,>=1.0.4->tfx) (0.6.1)\n",
      "Requirement already satisfied: werkzeug>=0.11.15 in /opt/conda/lib/python3.7/site-packages (from tensorboard->keras-tuner<2,>=1.0.4->tfx) (2.0.3)\n",
      "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /opt/conda/lib/python3.7/site-packages (from tensorboard->keras-tuner<2,>=1.0.4->tfx) (0.4.6)\n",
      "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /opt/conda/lib/python3.7/site-packages (from tensorboard->keras-tuner<2,>=1.0.4->tfx) (1.8.1)\n",
      "Requirement already satisfied: markdown>=2.6.8 in /opt/conda/lib/python3.7/site-packages (from tensorboard->keras-tuner<2,>=1.0.4->tfx) (3.3.6)\n",
      "Requirement already satisfied: oauthlib>=3.0.0 in /opt/conda/lib/python3.7/site-packages (from requests-oauthlib->kubernetes<13,>=10.0.1->tfx) (3.2.0)\n",
      "Requirement already satisfied: cffi>=1.0.0 in /opt/conda/lib/python3.7/site-packages (from google-crc32c<2.0dev,>=1.0->google-resumable-media<3.0dev,>=0.6.0->google-cloud-bigquery<3,>=2.26.0->tfx) (1.15.0)\n",
      "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.7/site-packages (from ipykernel>=4.5.1->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (1.5.4)\n",
      "Requirement already satisfied: tornado<7.0,>=4.2 in /opt/conda/lib/python3.7/site-packages (from ipykernel>=4.5.1->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (6.1)\n",
      "Requirement already satisfied: jupyter-client<8.0 in /opt/conda/lib/python3.7/site-packages (from ipykernel>=4.5.1->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (7.1.2)\n",
      "Requirement already satisfied: debugpy<2.0,>=1.0.0 in /opt/conda/lib/python3.7/site-packages (from ipykernel>=4.5.1->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (1.5.1)\n",
      "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /opt/conda/lib/python3.7/site-packages (from jedi>=0.16->ipython->keras-tuner<2,>=1.0.4->tfx) (0.8.3)\n",
      "Requirement already satisfied: importlib-metadata>=4.4 in /opt/conda/lib/python3.7/site-packages (from markdown>=2.6.8->tensorboard->keras-tuner<2,>=1.0.4->tfx) (4.11.3)\n",
      "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /opt/conda/lib/python3.7/site-packages (from nbformat>=4.2.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (4.4.0)\n",
      "Requirement already satisfied: jupyter-core in /opt/conda/lib/python3.7/site-packages (from nbformat>=4.2.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (4.9.2)\n",
      "Requirement already satisfied: typing-utils>=0.0.3 in /opt/conda/lib/python3.7/site-packages (from overrides<7.0.0,>=6.0.1->google-cloud-pubsublite<2,>=1.2.0->apache-beam[gcp]<3,>=2.36->tfx) (0.1.0)\n",
      "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.7/site-packages (from pexpect>4.3->ipython->keras-tuner<2,>=1.0.4->tfx) (0.7.0)\n",
      "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.7/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython->keras-tuner<2,>=1.0.4->tfx) (0.2.5)\n",
      "Requirement already satisfied: notebook>=4.4.1 in /opt/conda/lib/python3.7/site-packages (from widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (6.4.10)\n",
      "Requirement already satisfied: pycparser in /opt/conda/lib/python3.7/site-packages (from cffi>=1.0.0->google-crc32c<2.0dev,>=1.0->google-resumable-media<3.0dev,>=0.6.0->google-cloud-bigquery<3,>=2.26.0->tfx) (2.21)\n",
      "Requirement already satisfied: zipp>=0.5 in /opt/conda/lib/python3.7/site-packages (from importlib-metadata>=4.4->markdown>=2.6.8->tensorboard->keras-tuner<2,>=1.0.4->tfx) (3.7.0)\n",
      "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /opt/conda/lib/python3.7/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (0.18.1)\n",
      "Requirement already satisfied: importlib-resources>=1.4.0 in /opt/conda/lib/python3.7/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (5.4.0)\n",
      "Requirement already satisfied: entrypoints in /opt/conda/lib/python3.7/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (0.4)\n",
      "Requirement already satisfied: pyzmq>=13 in /opt/conda/lib/python3.7/site-packages (from jupyter-client<8.0->ipykernel>=4.5.1->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (22.3.0)\n",
      "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.7/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (0.13.1)\n",
      "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.7/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (0.13.3)\n",
      "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.7/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (21.3.0)\n",
      "Requirement already satisfied: nbconvert>=5 in /opt/conda/lib/python3.7/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (6.4.4)\n",
      "Requirement already satisfied: Send2Trash>=1.8.0 in /opt/conda/lib/python3.7/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (1.8.0)\n",
      "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.7/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (1.5.0)\n",
      "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.7/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (0.7.1)\n",
      "Requirement already satisfied: testpath in /opt/conda/lib/python3.7/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (0.6.0)\n",
      "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /opt/conda/lib/python3.7/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (0.5.13)\n",
      "Requirement already satisfied: beautifulsoup4 in /opt/conda/lib/python3.7/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (4.10.0)\n",
      "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.7/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (0.1.2)\n",
      "Requirement already satisfied: mistune<2,>=0.8.1 in /opt/conda/lib/python3.7/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (0.8.4)\n",
      "Requirement already satisfied: bleach in /opt/conda/lib/python3.7/site-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (4.1.0)\n",
      "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.7/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (21.2.0)\n",
      "Requirement already satisfied: soupsieve>1.2 in /opt/conda/lib/python3.7/site-packages (from beautifulsoup4->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (2.3.1)\n",
      "Requirement already satisfied: webencodings in /opt/conda/lib/python3.7/site-packages (from bleach->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7->tensorflow-model-analysis<0.39,>=0.38.0->tfx) (0.5.1)\n",
      "Building wheels for collected packages: dill, pyfarmhash\n",
      "  Building wheel for dill (setup.py) ... \u001b[?25ldone\n",
      "\u001b[?25h  Created wheel for dill: filename=dill-0.3.1.1-py3-none-any.whl size=78544 sha256=085427c0f127e389a49284f70a50c88b98509c1ebdafa674c588dbb7a4f4db1f\n",
      "  Stored in directory: /home/jupyter/.cache/pip/wheels/a4/61/fd/c57e374e580aa78a45ed78d5859b3a44436af17e22ca53284f\n",
      "  Building wheel for pyfarmhash (setup.py) ... \u001b[?25ldone\n",
      "\u001b[?25h  Created wheel for pyfarmhash: filename=pyfarmhash-0.3.2-cp37-cp37m-linux_x86_64.whl size=108631 sha256=afcb66db0477f58fcb20a0c7ef7af2aeb3d5a3fe9467a0c01ab060d2f4a65c77\n",
      "  Stored in directory: /home/jupyter/.cache/pip/wheels/53/58/7a/3b040f3a2ee31908e3be916e32660db6db53621ce6eba838dc\n",
      "Successfully built dill pyfarmhash\n",
      "Installing collected packages: tf-estimator-nightly, pyfarmhash, libclang, keras, joblib, uritemplate, tensorflow-io-gcs-filesystem, pyyaml, pyparsing, portpicker, numpy, dill, click, attrs, pyarrow, packaging, ml-metadata, httplib2, docker, kubernetes, google-api-core, tensorboard, google-cloud-core, google-api-python-client, tensorflow, ml-pipelines-sdk, google-cloud-vision, google-cloud-videointelligence, google-cloud-spanner, google-cloud-language, google-cloud-datastore, google-cloud-bigtable, tensorflow-model-analysis, tensorflow-data-validation, tfx\n",
      "  Attempting uninstall: keras\n",
      "    Found existing installation: keras 2.6.0\n",
      "    Uninstalling keras-2.6.0:\n",
      "      Successfully uninstalled keras-2.6.0\n",
      "  Attempting uninstall: joblib\n",
      "    Found existing installation: joblib 1.0.1\n",
      "    Uninstalling joblib-1.0.1:\n",
      "      Successfully uninstalled joblib-1.0.1\n",
      "  Attempting uninstall: uritemplate\n",
      "    Found existing installation: uritemplate 4.1.1\n",
      "    Uninstalling uritemplate-4.1.1:\n",
      "      Successfully uninstalled uritemplate-4.1.1\n",
      "  Attempting uninstall: pyyaml\n",
      "    Found existing installation: PyYAML 6.0\n",
      "    Uninstalling PyYAML-6.0:\n",
      "      Successfully uninstalled PyYAML-6.0\n",
      "  Attempting uninstall: pyparsing\n",
      "    Found existing installation: pyparsing 3.0.7\n",
      "    Uninstalling pyparsing-3.0.7:\n",
      "      Successfully uninstalled pyparsing-3.0.7\n",
      "  Attempting uninstall: numpy\n",
      "    Found existing installation: numpy 1.19.5\n",
      "    Uninstalling numpy-1.19.5:\n",
      "      Successfully uninstalled numpy-1.19.5\n",
      "  Attempting uninstall: dill\n",
      "    Found existing installation: dill 0.3.4\n",
      "    Uninstalling dill-0.3.4:\n",
      "      Successfully uninstalled dill-0.3.4\n",
      "  Attempting uninstall: click\n",
      "    Found existing installation: click 8.0.4\n",
      "    Uninstalling click-8.0.4:\n",
      "      Successfully uninstalled click-8.0.4\n",
      "  Attempting uninstall: attrs\n",
      "    Found existing installation: attrs 21.4.0\n",
      "    Uninstalling attrs-21.4.0:\n",
      "      Successfully uninstalled attrs-21.4.0\n",
      "  Attempting uninstall: pyarrow\n",
      "    Found existing installation: pyarrow 7.0.0\n",
      "    Uninstalling pyarrow-7.0.0:\n",
      "      Successfully uninstalled pyarrow-7.0.0\n",
      "  Attempting uninstall: packaging\n",
      "    Found existing installation: packaging 21.3\n",
      "    Uninstalling packaging-21.3:\n",
      "      Successfully uninstalled packaging-21.3\n",
      "  Attempting uninstall: httplib2\n",
      "    Found existing installation: httplib2 0.20.4\n",
      "    Uninstalling httplib2-0.20.4:\n",
      "      Successfully uninstalled httplib2-0.20.4\n",
      "  Attempting uninstall: docker\n",
      "    Found existing installation: docker 5.0.3\n",
      "    Uninstalling docker-5.0.3:\n",
      "      Successfully uninstalled docker-5.0.3\n",
      "  Attempting uninstall: kubernetes\n",
      "    Found existing installation: kubernetes 23.3.0\n",
      "    Uninstalling kubernetes-23.3.0:\n",
      "      Successfully uninstalled kubernetes-23.3.0\n",
      "  Attempting uninstall: google-api-core\n",
      "    Found existing installation: google-api-core 2.5.0\n",
      "    Uninstalling google-api-core-2.5.0:\n",
      "      Successfully uninstalled google-api-core-2.5.0\n",
      "  Attempting uninstall: tensorboard\n",
      "    Found existing installation: tensorboard 2.6.0\n",
      "    Uninstalling tensorboard-2.6.0:\n",
      "      Successfully uninstalled tensorboard-2.6.0\n",
      "  Attempting uninstall: google-cloud-core\n",
      "    Found existing installation: google-cloud-core 2.2.3\n",
      "    Uninstalling google-cloud-core-2.2.3:\n",
      "      Successfully uninstalled google-cloud-core-2.2.3\n",
      "  Attempting uninstall: google-api-python-client\n",
      "    Found existing installation: google-api-python-client 2.41.0\n",
      "    Uninstalling google-api-python-client-2.41.0:\n",
      "      Successfully uninstalled google-api-python-client-2.41.0\n",
      "  Attempting uninstall: tensorflow\n",
      "    Found existing installation: tensorflow 2.6.3\n",
      "    Uninstalling tensorflow-2.6.3:\n",
      "      Successfully uninstalled tensorflow-2.6.3\n",
      "  Attempting uninstall: google-cloud-vision\n",
      "    Found existing installation: google-cloud-vision 2.7.1\n",
      "    Uninstalling google-cloud-vision-2.7.1:\n",
      "      Successfully uninstalled google-cloud-vision-2.7.1\n",
      "  Attempting uninstall: google-cloud-videointelligence\n",
      "    Found existing installation: google-cloud-videointelligence 2.6.1\n",
      "    Uninstalling google-cloud-videointelligence-2.6.1:\n",
      "      Successfully uninstalled google-cloud-videointelligence-2.6.1\n",
      "  Attempting uninstall: google-cloud-spanner\n",
      "    Found existing installation: google-cloud-spanner 3.13.0\n",
      "    Uninstalling google-cloud-spanner-3.13.0:\n",
      "      Successfully uninstalled google-cloud-spanner-3.13.0\n",
      "  Attempting uninstall: google-cloud-language\n",
      "    Found existing installation: google-cloud-language 2.4.1\n",
      "    Uninstalling google-cloud-language-2.4.1:\n",
      "      Successfully uninstalled google-cloud-language-2.4.1\n",
      "  Attempting uninstall: google-cloud-datastore\n",
      "    Found existing installation: google-cloud-datastore 2.5.1\n",
      "    Uninstalling google-cloud-datastore-2.5.1:\n",
      "      Successfully uninstalled google-cloud-datastore-2.5.1\n",
      "  Attempting uninstall: google-cloud-bigtable\n",
      "    Found existing installation: google-cloud-bigtable 2.7.0\n",
      "    Uninstalling google-cloud-bigtable-2.7.0:\n",
      "      Successfully uninstalled google-cloud-bigtable-2.7.0\n",
      "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
      "tensorflow-io 0.21.0 requires tensorflow<2.7.0,>=2.6.0, but you have tensorflow 2.8.0 which is incompatible.\n",
      "tensorflow-io 0.21.0 requires tensorflow-io-gcs-filesystem==0.21.0, but you have tensorflow-io-gcs-filesystem 0.25.0 which is incompatible.\n",
      "statsmodels 0.13.2 requires packaging>=21.3, but you have packaging 20.9 which is incompatible.\n",
      "pandas-profiling 3.1.0 requires joblib~=1.0.1, but you have joblib 0.14.1 which is incompatible.\n",
      "cloud-tpu-client 0.10 requires google-api-python-client==1.8.0, but you have google-api-python-client 1.12.11 which is incompatible.\n",
      "black 22.1.0 requires click>=8.0.0, but you have click 7.1.2 which is incompatible.\u001b[0m\u001b[31m\n",
      "\u001b[0mSuccessfully installed attrs-20.3.0 click-7.1.2 dill-0.3.1.1 docker-4.4.4 google-api-core-1.31.5 google-api-python-client-1.12.11 google-cloud-bigtable-1.7.1 google-cloud-core-2.2.2 google-cloud-datastore-1.15.4 google-cloud-language-1.3.1 google-cloud-spanner-1.19.2 google-cloud-videointelligence-1.16.2 google-cloud-vision-1.0.1 httplib2-0.19.1 joblib-0.14.1 keras-2.8.0 kubernetes-12.0.1 libclang-14.0.1 ml-metadata-1.7.0 ml-pipelines-sdk-1.7.1 numpy-1.21.6 packaging-20.9 portpicker-1.5.0 pyarrow-5.0.0 pyfarmhash-0.3.2 pyparsing-2.4.7 pyyaml-5.4.1 tensorboard-2.8.0 tensorflow-2.8.0 tensorflow-data-validation-1.7.0 tensorflow-io-gcs-filesystem-0.25.0 tensorflow-model-analysis-0.38.0 tf-estimator-nightly-2.8.0.dev2021122109 tfx-1.7.1 uritemplate-3.0.1\n"
     ]
    }
   ],
   "source": [
    "# Install the TensorFlow Extended library\n",
    "!pip install -U tfx"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Restart the kernel\n",
    "Please ignore any incompatibility warnings and errors. __Restart__ the kernel to use updated packages. (On the Notebook menu, select Kernel > Restart Kernel > Restart)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "N-ePgV0Lj68Q"
   },
   "source": [
    "### Import packages\n",
    "You import necessary packages, including standard TFX component classes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "id": "YIqpWK9efviJ"
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import pprint\n",
    "import tempfile\n",
    "import urllib\n",
    "\n",
    "import absl\n",
    "import tensorflow as tf\n",
    "import tensorflow_model_analysis as tfma\n",
    "tf.get_logger().propagate = False\n",
    "pp = pprint.PrettyPrinter()\n",
    "\n",
    "from tfx import v1 as tfx\n",
    "from tfx.orchestration.experimental.interactive.interactive_context import InteractiveContext\n",
    "\n",
    "%load_ext tfx.orchestration.experimental.interactive.notebook_extensions.skip"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "wCZTHRy0N1D6"
   },
   "source": [
    "Let's check the library versions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "id": "eZ4K18_DN2D8"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TensorFlow version: 2.8.0\n",
      "TFX version: 1.7.1\n"
     ]
    }
   ],
   "source": [
    "print('TensorFlow version: {}'.format(tf.__version__))\n",
    "print('TFX version: {}'.format(tfx.__version__))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ufJKQ6OvkJlY"
   },
   "source": [
    "### Set up pipeline paths"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "id": "ad5JLpKbf6sN"
   },
   "outputs": [],
   "source": [
    "# This is the root directory for your TFX pip package installation.\n",
    "_tfx_root = tfx.__path__[0]\n",
    "\n",
    "# This is the directory containing the TFX Chicago Taxi Pipeline example.\n",
    "_taxi_root = os.path.join(_tfx_root, 'examples/chicago_taxi_pipeline')\n",
    "\n",
    "# TODO\n",
    "# This is the path where your model will be pushed for serving.\n",
    "_serving_model_dir = os.path.join(\n",
    "    tempfile.mkdtemp(), 'serving_model/taxi_simple')\n",
    "\n",
    "# Set up logging.\n",
    "absl.logging.set_verbosity(absl.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "n2cMMAbSkGfX"
   },
   "source": [
    "### Download example data\n",
    "You download the example dataset for use in your TFX pipeline.\n",
    "\n",
    "The dataset you're using is the [Taxi Trips dataset](https://data.cityofchicago.org/Transportation/Taxi-Trips/wrvz-psew) released by the City of Chicago. The columns in this dataset are:\n",
    "\n",
    "<table>\n",
    "<tr><td>pickup_community_area</td><td>fare</td><td>trip_start_month</td></tr>\n",
    "<tr><td>trip_start_hour</td><td>trip_start_day</td><td>trip_start_timestamp</td></tr>\n",
    "<tr><td>pickup_latitude</td><td>pickup_longitude</td><td>dropoff_latitude</td></tr>\n",
    "<tr><td>dropoff_longitude</td><td>trip_miles</td><td>pickup_census_tract</td></tr>\n",
    "<tr><td>dropoff_census_tract</td><td>payment_type</td><td>company</td></tr>\n",
    "<tr><td>trip_seconds</td><td>dropoff_community_area</td><td>tips</td></tr>\n",
    "</table>\n",
    "\n",
    "With this dataset, you will build a model that predicts the `tips` of a trip."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "id": "BywX6OUEhAqn"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "('/tmp/tfx-datal43bnql_/data.csv', <http.client.HTTPMessage at 0x7fca1eaa3f10>)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "_data_root = tempfile.mkdtemp(prefix='tfx-data')\n",
    "DATA_PATH = 'https://raw.githubusercontent.com/tensorflow/tfx/master/tfx/examples/chicago_taxi_pipeline/data/simple/data.csv'\n",
    "# TODO\n",
    "_data_filepath = os.path.join(_data_root, \"data.csv\")\n",
    "urllib.request.urlretrieve(DATA_PATH, _data_filepath)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "blZC1sIQOWfH"
   },
   "source": [
    "Take a quick look at the CSV file."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "id": "c5YPeLPFOXaD"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pickup_community_area,fare,trip_start_month,trip_start_hour,trip_start_day,trip_start_timestamp,pickup_latitude,pickup_longitude,dropoff_latitude,dropoff_longitude,trip_miles,pickup_census_tract,dropoff_census_tract,payment_type,company,trip_seconds,dropoff_community_area,tips\n",
      ",12.45,5,19,6,1400269500,,,,,0.0,,,Credit Card,Chicago Elite Cab Corp. (Chicago Carriag,0,,0.0\n",
      ",0,3,19,5,1362683700,,,,,0,,,Unknown,Chicago Elite Cab Corp.,300,,0\n",
      "60,27.05,10,2,3,1380593700,41.836150155,-87.648787952,,,12.6,,,Cash,Taxi Affiliation Services,1380,,0.0\n",
      "10,5.85,10,1,2,1382319000,41.985015101,-87.804532006,,,0.0,,,Cash,Taxi Affiliation Services,180,,0.0\n",
      "14,16.65,5,7,5,1369897200,41.968069,-87.721559063,,,0.0,,,Cash,Dispatch Taxi Affiliation,1080,,0.0\n",
      "13,16.45,11,12,3,1446554700,41.983636307,-87.723583185,,,6.9,,,Cash,,780,,0.0\n",
      "16,32.05,12,1,1,1417916700,41.953582125,-87.72345239,,,15.4,,,Cash,,1200,,0.0\n",
      "30,38.45,10,10,5,1444301100,41.839086906,-87.714003807,,,14.6,,,Cash,,2580,,0.0\n",
      "11,14.65,1,1,3,1358213400,41.978829526,-87.771166703,,,5.81,,,Cash,,1080,,0.0\n"
     ]
    }
   ],
   "source": [
    "# print first ten lines of the file\n",
    "!head {_data_filepath}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "QioyhunCImwE"
   },
   "source": [
    "*Disclaimer: This site provides applications using data that has been modified for use from its original source, www.cityofchicago.org, the official website of the City of Chicago. The City of Chicago makes no claims as to the content, accuracy, timeliness, or completeness of any of the data provided at this site. The data provided at this site is subject to change at any time. It is understood that the data provided at this site is being used at one’s own risk.*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "8ONIE_hdkPS4"
   },
   "source": [
    "### Create the InteractiveContext\n",
    "Last, you create an InteractiveContext, which will allow you to run TFX components interactively in this notebook."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "id": "0Rh6K5sUf9dd"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:InteractiveContext pipeline_root argument not provided: using temporary directory /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju as root for pipeline outputs.\n",
      "WARNING:absl:InteractiveContext metadata_connection_config not provided: using SQLite ML Metadata database at /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/metadata.sqlite.\n"
     ]
    }
   ],
   "source": [
    "# Here, you create an InteractiveContext using default parameters. This will\n",
    "# use a temporary directory with an ephemeral ML Metadata database instance.\n",
    "# To use your own pipeline root or database, the optional properties\n",
    "# `pipeline_root` and `metadata_connection_config` may be passed to\n",
    "# InteractiveContext. Calls to InteractiveContext are no-ops outside of the\n",
    "# notebook.\n",
    "context = InteractiveContext()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HdQWxfsVkzdJ"
   },
   "source": [
    "## Run TFX components interactively\n",
    "In the cells that follow, you create TFX components one-by-one, run each of them, and visualize their output artifacts."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "L9fwt9gQk3BR"
   },
   "source": [
    "### ExampleGen\n",
    "\n",
    "The `ExampleGen` component is usually at the start of a TFX pipeline. It will:\n",
    "\n",
    "1.   Split data into training and evaluation sets (by default, 2/3 training + 1/3 eval)\n",
    "2.   Convert data into the `tf.Example` format (learn more [here](https://www.tensorflow.org/tutorials/load_data/tfrecord))\n",
    "3.   Copy data into the `_tfx_root` directory for other components to access\n",
    "\n",
    "`ExampleGen` takes as input the path to your data source. In your case, this is the `_data_root` path that contains the downloaded CSV.\n",
    "\n",
    "Note: In this notebook, you can instantiate components one-by-one and run them with `InteractiveContext.run()`. By contrast, in a production setting, you would specify all the components upfront in a `Pipeline` to pass to the orchestrator (see the [Building a TFX Pipeline Guide](https://www.tensorflow.org/tfx/guide/build_tfx_pipeline)).\n",
    "\n",
    "#### Enabling the Cache\n",
    "When using the `InteractiveContext` in a notebook to develop a pipeline you can control when individual components will cache their outputs.  Set `enable_cache` to `True` when you want to reuse the previous output artifacts that the component generated.  Set `enable_cache` to `False` when you want to recompute the output artifacts for a component, if you are making changes to the code for example."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "id": "PyXjuMt8f-9u"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Running driver for CsvExampleGen\n",
      "INFO:absl:MetadataStore with DB connection initialized\n",
      "INFO:absl:select span and version = (0, None)\n",
      "INFO:absl:latest span and version = (0, None)\n",
      "INFO:absl:Running executor for CsvExampleGen\n",
      "INFO:absl:Generating examples.\n",
      "WARNING:apache_beam.runners.interactive.interactive_environment:Dependencies required for Interactive Beam PCollection visualization are not available, please use: `pip install apache-beam[interactive]` to install necessary dependencies to enable all data visualization features.\n"
     ]
    },
    {
     "data": {
      "application/javascript": [
       "\n",
       "        if (typeof window.interactive_beam_jquery == 'undefined') {\n",
       "          var jqueryScript = document.createElement('script');\n",
       "          jqueryScript.src = 'https://code.jquery.com/jquery-3.4.1.slim.min.js';\n",
       "          jqueryScript.type = 'text/javascript';\n",
       "          jqueryScript.onload = function() {\n",
       "            var datatableScript = document.createElement('script');\n",
       "            datatableScript.src = 'https://cdn.datatables.net/1.10.20/js/jquery.dataTables.min.js';\n",
       "            datatableScript.type = 'text/javascript';\n",
       "            datatableScript.onload = function() {\n",
       "              window.interactive_beam_jquery = jQuery.noConflict(true);\n",
       "              window.interactive_beam_jquery(document).ready(function($){\n",
       "                \n",
       "              });\n",
       "            }\n",
       "            document.head.appendChild(datatableScript);\n",
       "          };\n",
       "          document.head.appendChild(jqueryScript);\n",
       "        } else {\n",
       "          window.interactive_beam_jquery(document).ready(function($){\n",
       "            \n",
       "          });\n",
       "        }"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Processing input csv data /tmp/tfx-datal43bnql_/* to TFExample.\n",
      "WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.\n",
      "WARNING:apache_beam.io.tfrecordio:Couldn't find python-snappy so the implementation of _TFRecordUtil._masked_crc32c is not as fast as it could be.\n",
      "INFO:absl:Examples generated.\n",
      "INFO:absl:Running publisher for CsvExampleGen\n",
      "INFO:absl:MetadataStore with DB connection initialized\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object expanded\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">ExecutionResult</span><span class=\"deemphasize\"> at 0x7fca1eaa3e90</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.execution_id</td><td class = \"attrvalue\">1</td></tr><tr><td class=\"attr-name\">.component</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">CsvExampleGen</span><span class=\"deemphasize\"> at 0x7fca1eaa0f90</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.inputs</td><td class = \"attrvalue\">{}</td></tr><tr><td class=\"attr-name\">.outputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['examples']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Examples'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1eaa3ad0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Examples</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Examples'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1)<span class=\"deemphasize\"> at 0x7fca1ea89c90</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Examples&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;train&quot;, &quot;eval&quot;]</td></tr><tr><td class=\"attr-name\">.version</td><td class = \"attrvalue\">0</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.exec_properties</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['input_base']</td><td class = \"attrvalue\">/tmp/tfx-datal43bnql_</td></tr><tr><td class=\"attr-name\">['input_config']</td><td class = \"attrvalue\">{\n",
       "  &quot;splits&quot;: [\n",
       "    {\n",
       "      &quot;name&quot;: &quot;single_split&quot;,\n",
       "      &quot;pattern&quot;: &quot;*&quot;\n",
       "    }\n",
       "  ]\n",
       "}</td></tr><tr><td class=\"attr-name\">['output_config']</td><td class = \"attrvalue\">{\n",
       "  &quot;split_config&quot;: {\n",
       "    &quot;splits&quot;: [\n",
       "      {\n",
       "        &quot;hash_buckets&quot;: 2,\n",
       "        &quot;name&quot;: &quot;train&quot;\n",
       "      },\n",
       "      {\n",
       "        &quot;hash_buckets&quot;: 1,\n",
       "        &quot;name&quot;: &quot;eval&quot;\n",
       "      }\n",
       "    ]\n",
       "  }\n",
       "}</td></tr><tr><td class=\"attr-name\">['output_data_format']</td><td class = \"attrvalue\">6</td></tr><tr><td class=\"attr-name\">['output_file_format']</td><td class = \"attrvalue\">5</td></tr><tr><td class=\"attr-name\">['custom_config']</td><td class = \"attrvalue\">None</td></tr><tr><td class=\"attr-name\">['range_config']</td><td class = \"attrvalue\">None</td></tr><tr><td class=\"attr-name\">['span']</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">['version']</td><td class = \"attrvalue\">None</td></tr><tr><td class=\"attr-name\">['input_fingerprint']</td><td class = \"attrvalue\">split:single_split,num_files:1,total_bytes:1922812,xor_checksum:1652379559,sum_checksum:1652379559</td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">.component.inputs</td><td class = \"attrvalue\">{}</td></tr><tr><td class=\"attr-name\">.component.outputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['examples']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Examples'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1eaa3ad0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Examples</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Examples'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1)<span class=\"deemphasize\"> at 0x7fca1ea89c90</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Examples&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;train&quot;, &quot;eval&quot;]</td></tr><tr><td class=\"attr-name\">.version</td><td class = \"attrvalue\">0</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr></table></div>"
      ],
      "text/plain": [
       "ExecutionResult(\n",
       "    component_id: CsvExampleGen\n",
       "    execution_id: 1\n",
       "    outputs:\n",
       "        examples: OutputChannel(artifact_type=Examples, producer_component_id=CsvExampleGen, output_key=examples, additional_properties={}, additional_custom_properties={}))"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "example_gen = tfx.components.CsvExampleGen(input_base=_data_root)\n",
    "context.run(example_gen, enable_cache=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "OqCoZh7KPUm9"
   },
   "source": [
    "Let's examine the output artifacts of `ExampleGen`. This component produces two artifacts, training examples and evaluation examples:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "id": "880KkTAkPeUg"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[\"train\", \"eval\"] /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1\n"
     ]
    }
   ],
   "source": [
    "artifact = example_gen.outputs['examples'].get()[0]\n",
    "print(artifact.split_names, artifact.uri)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "J6vcbW_wPqvl"
   },
   "source": [
    "You can also take a look at the first three training examples:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "id": "H4XIXjiCPwzQ"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "features {\n",
      "  feature {\n",
      "    key: \"company\"\n",
      "    value {\n",
      "      bytes_list {\n",
      "        value: \"Chicago Elite Cab Corp. (Chicago Carriag\"\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_census_tract\"\n",
      "    value {\n",
      "      int64_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_community_area\"\n",
      "    value {\n",
      "      int64_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_latitude\"\n",
      "    value {\n",
      "      float_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_longitude\"\n",
      "    value {\n",
      "      float_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"fare\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 12.449999809265137\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"payment_type\"\n",
      "    value {\n",
      "      bytes_list {\n",
      "        value: \"Credit Card\"\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_census_tract\"\n",
      "    value {\n",
      "      int64_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_community_area\"\n",
      "    value {\n",
      "      int64_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_latitude\"\n",
      "    value {\n",
      "      float_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_longitude\"\n",
      "    value {\n",
      "      float_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"tips\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_miles\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_seconds\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_day\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 6\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_hour\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 19\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_month\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 5\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_timestamp\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 1400269500\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "}\n",
      "\n",
      "features {\n",
      "  feature {\n",
      "    key: \"company\"\n",
      "    value {\n",
      "      bytes_list {\n",
      "        value: \"Taxi Affiliation Services\"\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_census_tract\"\n",
      "    value {\n",
      "      int64_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_community_area\"\n",
      "    value {\n",
      "      int64_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_latitude\"\n",
      "    value {\n",
      "      float_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_longitude\"\n",
      "    value {\n",
      "      float_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"fare\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 27.049999237060547\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"payment_type\"\n",
      "    value {\n",
      "      bytes_list {\n",
      "        value: \"Cash\"\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_census_tract\"\n",
      "    value {\n",
      "      int64_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_community_area\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 60\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_latitude\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 41.836151123046875\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_longitude\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: -87.64878845214844\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"tips\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_miles\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 12.600000381469727\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_seconds\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 1380\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_day\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 3\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_hour\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 2\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_month\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 10\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_timestamp\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 1380593700\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "}\n",
      "\n",
      "features {\n",
      "  feature {\n",
      "    key: \"company\"\n",
      "    value {\n",
      "      bytes_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_census_tract\"\n",
      "    value {\n",
      "      int64_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_community_area\"\n",
      "    value {\n",
      "      int64_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_latitude\"\n",
      "    value {\n",
      "      float_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_longitude\"\n",
      "    value {\n",
      "      float_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"fare\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 16.450000762939453\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"payment_type\"\n",
      "    value {\n",
      "      bytes_list {\n",
      "        value: \"Cash\"\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_census_tract\"\n",
      "    value {\n",
      "      int64_list {\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_community_area\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 13\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_latitude\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 41.98363494873047\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_longitude\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: -87.72357940673828\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"tips\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_miles\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 6.900000095367432\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_seconds\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 780\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_day\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 3\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_hour\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 12\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_month\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 11\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_timestamp\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 1446554700\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "}\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2022-05-12 18:20:03.219001: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda/lib64:/usr/local/nccl2/lib:/usr/local/cuda/extras/CUPTI/lib64\n",
      "2022-05-12 18:20:03.219078: W tensorflow/stream_executor/cuda/cuda_driver.cc:269] failed call to cuInit: UNKNOWN ERROR (303)\n",
      "2022-05-12 18:20:03.219118: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (tensorflow-2-6-20220512-232932): /proc/driver/nvidia/version does not exist\n",
      "2022-05-12 18:20:03.219645: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA\n",
      "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
     ]
    }
   ],
   "source": [
    "# Get the URI of the output artifact representing the training examples, which is a directory\n",
    "train_uri = os.path.join(example_gen.outputs['examples'].get()[0].uri, 'Split-train')\n",
    "\n",
    "# Get the list of files in this directory (all compressed TFRecord files)\n",
    "tfrecord_filenames = [os.path.join(train_uri, name)\n",
    "                      for name in os.listdir(train_uri)]\n",
    "\n",
    "# Create a `TFRecordDataset` to read these files\n",
    "dataset = tf.data.TFRecordDataset(tfrecord_filenames, compression_type=\"GZIP\")\n",
    "\n",
    "# Iterate over the first 3 records and decode them.\n",
    "for tfrecord in dataset.take(3):\n",
    "  serialized_example = tfrecord.numpy()\n",
    "  example = tf.train.Example()\n",
    "  example.ParseFromString(serialized_example)\n",
    "  pp.pprint(example)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "2gluYjccf-IP"
   },
   "source": [
    "Now that `ExampleGen` has finished ingesting the data, the next step is data analysis."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "csM6BFhtk5Aa"
   },
   "source": [
    "### StatisticsGen\n",
    "The `StatisticsGen` component computes statistics over your dataset for data analysis, as well as for use in downstream components. It uses the [TensorFlow Data Validation](https://www.tensorflow.org/tfx/data_validation/get_started) library.\n",
    "\n",
    "`StatisticsGen` takes as input the dataset you just ingested using `ExampleGen`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "id": "MAscCCYWgA-9"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Excluding no splits because exclude_splits is not set.\n",
      "INFO:absl:Running driver for StatisticsGen\n",
      "INFO:absl:MetadataStore with DB connection initialized\n",
      "INFO:absl:Running executor for StatisticsGen\n",
      "INFO:absl:Generating statistics for split train.\n",
      "INFO:absl:Statistics for split train written to /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/StatisticsGen/statistics/2/Split-train.\n",
      "INFO:absl:Generating statistics for split eval.\n",
      "INFO:absl:Statistics for split eval written to /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/StatisticsGen/statistics/2/Split-eval.\n",
      "WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.\n",
      "INFO:absl:Running publisher for StatisticsGen\n",
      "INFO:absl:MetadataStore with DB connection initialized\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object expanded\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">ExecutionResult</span><span class=\"deemphasize\"> at 0x7fca459ffc10</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.execution_id</td><td class = \"attrvalue\">2</td></tr><tr><td class=\"attr-name\">.component</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">StatisticsGen</span><span class=\"deemphasize\"> at 0x7fca459ff710</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.inputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['examples']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Examples'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1eaa3ad0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Examples</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Examples'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1)<span class=\"deemphasize\"> at 0x7fca1ea89c90</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Examples&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;train&quot;, &quot;eval&quot;]</td></tr><tr><td class=\"attr-name\">.version</td><td class = \"attrvalue\">0</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.outputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['statistics']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca45d812d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ExampleStatistics</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/StatisticsGen/statistics/2)<span class=\"deemphasize\"> at 0x7fca1e79f4d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ExampleStatistics&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/StatisticsGen/statistics/2</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;train&quot;, &quot;eval&quot;]</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.exec_properties</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['stats_options_json']</td><td class = \"attrvalue\">None</td></tr><tr><td class=\"attr-name\">['exclude_splits']</td><td class = \"attrvalue\">[]</td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">.component.inputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['examples']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Examples'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1eaa3ad0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Examples</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Examples'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1)<span class=\"deemphasize\"> at 0x7fca1ea89c90</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Examples&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;train&quot;, &quot;eval&quot;]</td></tr><tr><td class=\"attr-name\">.version</td><td class = \"attrvalue\">0</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.component.outputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['statistics']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca45d812d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ExampleStatistics</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/StatisticsGen/statistics/2)<span class=\"deemphasize\"> at 0x7fca1e79f4d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ExampleStatistics&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/StatisticsGen/statistics/2</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;train&quot;, &quot;eval&quot;]</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr></table></div>"
      ],
      "text/plain": [
       "ExecutionResult(\n",
       "    component_id: StatisticsGen\n",
       "    execution_id: 2\n",
       "    outputs:\n",
       "        statistics: OutputChannel(artifact_type=ExampleStatistics, producer_component_id=StatisticsGen, output_key=statistics, additional_properties={}, additional_custom_properties={}))"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "statistics_gen = tfx.components.StatisticsGen(\n",
    "    examples=example_gen.outputs['examples'])\n",
    "context.run(statistics_gen, enable_cache=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HLI6cb_5WugZ"
   },
   "source": [
    "After `StatisticsGen` finishes running, you can visualize the outputted statistics. Try playing with the different plots!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "id": "tLjXy7K6Tp_G"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<b>Artifact at /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/StatisticsGen/statistics/2</b><br/><br/>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div><b>'train' split:</b></div><br/>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<iframe id='facets-iframe' width=\"100%\" height=\"500px\"></iframe>\n",
       "        <script>\n",
       "        facets_iframe = document.getElementById('facets-iframe');\n",
       "        facets_html = '<script src=\"https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/1.3.3/webcomponents-lite.js\"><\\/script><link rel=\"import\" href=\"https://raw.githubusercontent.com/PAIR-code/facets/master/facets-dist/facets-jupyter.html\"><facets-overview proto-input=\"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\"></facets-overview>';\n",
       "        facets_iframe.srcdoc = facets_html;\n",
       "         facets_iframe.id = \"\";\n",
       "         setTimeout(() => {\n",
       "           facets_iframe.setAttribute('height', facets_iframe.contentWindow.document.body.offsetHeight + 'px')\n",
       "         }, 1500)\n",
       "         </script>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div><b>'eval' split:</b></div><br/>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<iframe id='facets-iframe' width=\"100%\" height=\"500px\"></iframe>\n",
       "        <script>\n",
       "        facets_iframe = document.getElementById('facets-iframe');\n",
       "        facets_html = '<script src=\"https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/1.3.3/webcomponents-lite.js\"><\\/script><link rel=\"import\" href=\"https://raw.githubusercontent.com/PAIR-code/facets/master/facets-dist/facets-jupyter.html\"><facets-overview proto-input=\"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\"></facets-overview>';\n",
       "        facets_iframe.srcdoc = facets_html;\n",
       "         facets_iframe.id = \"\";\n",
       "         setTimeout(() => {\n",
       "           facets_iframe.setAttribute('height', facets_iframe.contentWindow.document.body.offsetHeight + 'px')\n",
       "         }, 1500)\n",
       "         </script>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "context.show(statistics_gen.outputs['statistics'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HLKLTO9Nk60p"
   },
   "source": [
    "### SchemaGen\n",
    "\n",
    "The `SchemaGen` component generates a schema based on your data statistics. (A schema defines the expected bounds, types, and properties of the features in your dataset.) It also uses the [TensorFlow Data Validation](https://www.tensorflow.org/tfx/data_validation/get_started) library.\n",
    "\n",
    "Note: The generated schema is best-effort and only tries to infer basic properties of the data. It is expected that you review and modify it as needed.\n",
    "\n",
    "`SchemaGen` will take as input the statistics that you generated with `StatisticsGen`, looking at the training split by default."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "id": "ygQvZ6hsiQ_J"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Excluding no splits because exclude_splits is not set.\n",
      "INFO:absl:Running driver for SchemaGen\n",
      "INFO:absl:MetadataStore with DB connection initialized\n",
      "INFO:absl:Running executor for SchemaGen\n",
      "INFO:absl:Processing schema from statistics for split train.\n",
      "INFO:absl:Processing schema from statistics for split eval.\n",
      "INFO:absl:Schema written to /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3/schema.pbtxt.\n",
      "INFO:absl:Running publisher for SchemaGen\n",
      "INFO:absl:MetadataStore with DB connection initialized\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object expanded\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">ExecutionResult</span><span class=\"deemphasize\"> at 0x7fca456f0190</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.execution_id</td><td class = \"attrvalue\">3</td></tr><tr><td class=\"attr-name\">.component</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">SchemaGen</span><span class=\"deemphasize\"> at 0x7fca1e82eed0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.inputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['statistics']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca45d812d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ExampleStatistics</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/StatisticsGen/statistics/2)<span class=\"deemphasize\"> at 0x7fca1e79f4d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ExampleStatistics&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/StatisticsGen/statistics/2</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;train&quot;, &quot;eval&quot;]</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.outputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['schema']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Schema'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e7d35d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Schema</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Schema'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3)<span class=\"deemphasize\"> at 0x7fca45729f10</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Schema&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.exec_properties</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['infer_feature_shape']</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">['exclude_splits']</td><td class = \"attrvalue\">[]</td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">.component.inputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['statistics']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca45d812d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ExampleStatistics</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/StatisticsGen/statistics/2)<span class=\"deemphasize\"> at 0x7fca1e79f4d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ExampleStatistics&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/StatisticsGen/statistics/2</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;train&quot;, &quot;eval&quot;]</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.component.outputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['schema']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Schema'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e7d35d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Schema</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Schema'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3)<span class=\"deemphasize\"> at 0x7fca45729f10</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Schema&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr></table></div>"
      ],
      "text/plain": [
       "ExecutionResult(\n",
       "    component_id: SchemaGen\n",
       "    execution_id: 3\n",
       "    outputs:\n",
       "        schema: OutputChannel(artifact_type=Schema, producer_component_id=SchemaGen, output_key=schema, additional_properties={}, additional_custom_properties={}))"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "schema_gen = tfx.components.SchemaGen(\n",
    "    statistics=statistics_gen.outputs['statistics'],\n",
    "    infer_feature_shape=False)\n",
    "context.run(schema_gen, enable_cache=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "zi6TxTUKXM6b"
   },
   "source": [
    "After `SchemaGen` finishes running, you can visualize the generated schema as a table."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "id": "Ec9vqDXpXeMb"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<b>Artifact at /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3</b><br/><br/>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Type</th>\n",
       "      <th>Presence</th>\n",
       "      <th>Valency</th>\n",
       "      <th>Domain</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Feature name</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>'company'</th>\n",
       "      <td>STRING</td>\n",
       "      <td>required</td>\n",
       "      <td></td>\n",
       "      <td>'company'</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'payment_type'</th>\n",
       "      <td>STRING</td>\n",
       "      <td>required</td>\n",
       "      <td>single</td>\n",
       "      <td>'payment_type'</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'dropoff_census_tract'</th>\n",
       "      <td>INT</td>\n",
       "      <td>required</td>\n",
       "      <td></td>\n",
       "      <td>-</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'dropoff_community_area'</th>\n",
       "      <td>INT</td>\n",
       "      <td>required</td>\n",
       "      <td></td>\n",
       "      <td>-</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'dropoff_latitude'</th>\n",
       "      <td>FLOAT</td>\n",
       "      <td>required</td>\n",
       "      <td></td>\n",
       "      <td>-</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'dropoff_longitude'</th>\n",
       "      <td>FLOAT</td>\n",
       "      <td>required</td>\n",
       "      <td></td>\n",
       "      <td>-</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'fare'</th>\n",
       "      <td>FLOAT</td>\n",
       "      <td>required</td>\n",
       "      <td>single</td>\n",
       "      <td>-</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'pickup_census_tract'</th>\n",
       "      <td>INT</td>\n",
       "      <td>required</td>\n",
       "      <td></td>\n",
       "      <td>-</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'pickup_community_area'</th>\n",
       "      <td>INT</td>\n",
       "      <td>required</td>\n",
       "      <td></td>\n",
       "      <td>-</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'pickup_latitude'</th>\n",
       "      <td>FLOAT</td>\n",
       "      <td>required</td>\n",
       "      <td></td>\n",
       "      <td>-</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'pickup_longitude'</th>\n",
       "      <td>FLOAT</td>\n",
       "      <td>required</td>\n",
       "      <td></td>\n",
       "      <td>-</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'tips'</th>\n",
       "      <td>FLOAT</td>\n",
       "      <td>required</td>\n",
       "      <td>single</td>\n",
       "      <td>-</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'trip_miles'</th>\n",
       "      <td>FLOAT</td>\n",
       "      <td>required</td>\n",
       "      <td>single</td>\n",
       "      <td>-</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'trip_seconds'</th>\n",
       "      <td>INT</td>\n",
       "      <td>required</td>\n",
       "      <td></td>\n",
       "      <td>-</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'trip_start_day'</th>\n",
       "      <td>INT</td>\n",
       "      <td>required</td>\n",
       "      <td>single</td>\n",
       "      <td>-</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'trip_start_hour'</th>\n",
       "      <td>INT</td>\n",
       "      <td>required</td>\n",
       "      <td>single</td>\n",
       "      <td>-</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'trip_start_month'</th>\n",
       "      <td>INT</td>\n",
       "      <td>required</td>\n",
       "      <td>single</td>\n",
       "      <td>-</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'trip_start_timestamp'</th>\n",
       "      <td>INT</td>\n",
       "      <td>required</td>\n",
       "      <td>single</td>\n",
       "      <td>-</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                            Type  Presence Valency          Domain\n",
       "Feature name                                                      \n",
       "'company'                 STRING  required               'company'\n",
       "'payment_type'            STRING  required  single  'payment_type'\n",
       "'dropoff_census_tract'       INT  required                       -\n",
       "'dropoff_community_area'     INT  required                       -\n",
       "'dropoff_latitude'         FLOAT  required                       -\n",
       "'dropoff_longitude'        FLOAT  required                       -\n",
       "'fare'                     FLOAT  required  single               -\n",
       "'pickup_census_tract'        INT  required                       -\n",
       "'pickup_community_area'      INT  required                       -\n",
       "'pickup_latitude'          FLOAT  required                       -\n",
       "'pickup_longitude'         FLOAT  required                       -\n",
       "'tips'                     FLOAT  required  single               -\n",
       "'trip_miles'               FLOAT  required  single               -\n",
       "'trip_seconds'               INT  required                       -\n",
       "'trip_start_day'             INT  required  single               -\n",
       "'trip_start_hour'            INT  required  single               -\n",
       "'trip_start_month'           INT  required  single               -\n",
       "'trip_start_timestamp'       INT  required  single               -"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Values</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Domain</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>'company'</th>\n",
       "      <td>'0118 - 42111 Godfrey S.Awir', '1085 - 72312 N and W Cab Co', '2192 - 73487 Zeymane Corp', '2733 - 74600 Benny Jona', '3011 - 66308 JBL Cab Inc.', '3152 - 97284 Crystal Abernathy', '3201 - C&amp;D Cab Co Inc', '3201 - CID Cab Co Inc', '3253 - 91138 Gaither Cab Co.', '3319 - CD Cab Co', '3385 - 23210 Eman Cab', '3385 - Eman Cab', '3623 - 72222 Arrington Enterprises', '3897 - 57856 Ilie Malec', '4053 - 40193 Adwar H. Nikola', '4197 - 41842 Royal Star', '4197 - Royal Star', '4615 - 83503 Tyrone Henderson', '4615 - Tyrone Henderson', '4623 - Jay Kim', '5006 - 39261 Salifu Bawa', '5074 - 54002 Ahzmi Inc', '5074 - Ahzmi Inc', '5129 - 87128', '5129 - 98755 Mengisti Taxi', '585 - 88805 Valley Cab Co', '5864 - Thomas Owusu', '5874 - 73628 Sergey Cab Corp.', '5874 - Sergey Cab Corp.', '5997 - 65283 AW Services Inc.', '6488 - 83287 Zuha Taxi', '6574 - Babylon Express Inc.', '6742 - 83735 Tasha ride inc', 'Blue Ribbon Taxi Association Inc.', 'C &amp; D Cab Co Inc', 'Chicago Elite Cab Corp.', 'Chicago Elite Cab Corp. (Chicago Carriag', 'Chicago Medallion Leasing INC', 'Chicago Medallion Management', 'Choice Taxi Association', 'Dispatch Taxi Affiliation', 'KOAM Taxi Association', 'Northwest Management LLC', 'Taxi Affiliation Services', 'Top Cab Affiliation', '0694 - 59280 Chinesco Trans Inc', '2092 - 61288 Sbeih company', '2192 - Zeymane Corp', '2809 - 95474 C &amp; D Cab Co Inc.', '2823 - 73307 Seung Lee', '3094 - 24059 G.L.B. Cab Co', '3897 - Ilie Malec', '4053 - Adwar H. Nikola', '5006 - Salifu Bawa', '5129 - Mengisti Taxi', '5724 - KYVI Cab Inc', '585 - Valley Cab Co', '5864 - 73614 Thomas Owusu', '5997 - AW Services Inc.', '6057 - 24657 Richard Addo', '6743 - Luhak Corp'</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>'payment_type'</th>\n",
       "      <td>'Cash', 'Credit Card', 'Dispute', 'No Charge', 'Pcard', 'Unknown', 'Prcard'</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Values\n",
       "Domain                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        \n",
       "'company'       '0118 - 42111 Godfrey S.Awir', '1085 - 72312 N and W Cab Co', '2192 - 73487 Zeymane Corp', '2733 - 74600 Benny Jona', '3011 - 66308 JBL Cab Inc.', '3152 - 97284 Crystal Abernathy', '3201 - C&D Cab Co Inc', '3201 - CID Cab Co Inc', '3253 - 91138 Gaither Cab Co.', '3319 - CD Cab Co', '3385 - 23210 Eman Cab', '3385 - Eman Cab', '3623 - 72222 Arrington Enterprises', '3897 - 57856 Ilie Malec', '4053 - 40193 Adwar H. Nikola', '4197 - 41842 Royal Star', '4197 - Royal Star', '4615 - 83503 Tyrone Henderson', '4615 - Tyrone Henderson', '4623 - Jay Kim', '5006 - 39261 Salifu Bawa', '5074 - 54002 Ahzmi Inc', '5074 - Ahzmi Inc', '5129 - 87128', '5129 - 98755 Mengisti Taxi', '585 - 88805 Valley Cab Co', '5864 - Thomas Owusu', '5874 - 73628 Sergey Cab Corp.', '5874 - Sergey Cab Corp.', '5997 - 65283 AW Services Inc.', '6488 - 83287 Zuha Taxi', '6574 - Babylon Express Inc.', '6742 - 83735 Tasha ride inc', 'Blue Ribbon Taxi Association Inc.', 'C & D Cab Co Inc', 'Chicago Elite Cab Corp.', 'Chicago Elite Cab Corp. (Chicago Carriag', 'Chicago Medallion Leasing INC', 'Chicago Medallion Management', 'Choice Taxi Association', 'Dispatch Taxi Affiliation', 'KOAM Taxi Association', 'Northwest Management LLC', 'Taxi Affiliation Services', 'Top Cab Affiliation', '0694 - 59280 Chinesco Trans Inc', '2092 - 61288 Sbeih company', '2192 - Zeymane Corp', '2809 - 95474 C & D Cab Co Inc.', '2823 - 73307 Seung Lee', '3094 - 24059 G.L.B. Cab Co', '3897 - Ilie Malec', '4053 - Adwar H. Nikola', '5006 - Salifu Bawa', '5129 - Mengisti Taxi', '5724 - KYVI Cab Inc', '585 - Valley Cab Co', '5864 - 73614 Thomas Owusu', '5997 - AW Services Inc.', '6057 - 24657 Richard Addo', '6743 - Luhak Corp'\n",
       "'payment_type'                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     'Cash', 'Credit Card', 'Dispute', 'No Charge', 'Pcard', 'Unknown', 'Prcard'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "context.show(schema_gen.outputs['schema'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "kZWWdbA-m7zp"
   },
   "source": [
    "Each feature in your dataset shows up as a row in the schema table, alongside its properties. The schema also captures all the values that a categorical feature takes on, denoted as its domain.\n",
    "\n",
    "To learn more about schemas, see [the SchemaGen documentation](https://www.tensorflow.org/tfx/guide/schemagen)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "V1qcUuO9k9f8"
   },
   "source": [
    "### ExampleValidator\n",
    "The `ExampleValidator` component detects anomalies in your data, based on the expectations defined by the schema. It also uses the [TensorFlow Data Validation](https://www.tensorflow.org/tfx/data_validation/get_started) library.\n",
    "\n",
    "`ExampleValidator` will take as input the statistics from `StatisticsGen`, and the schema from `SchemaGen`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "id": "XRlRUuGgiXks"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Excluding no splits because exclude_splits is not set.\n",
      "INFO:absl:Running driver for ExampleValidator\n",
      "INFO:absl:MetadataStore with DB connection initialized\n",
      "INFO:absl:Running executor for ExampleValidator\n",
      "INFO:absl:Validating schema against the computed statistics for split train.\n",
      "INFO:absl:Validation complete for split train. Anomalies written to /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/ExampleValidator/anomalies/4/Split-train.\n",
      "INFO:absl:Validating schema against the computed statistics for split eval.\n",
      "INFO:absl:Validation complete for split eval. Anomalies written to /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/ExampleValidator/anomalies/4/Split-eval.\n",
      "INFO:absl:Running publisher for ExampleValidator\n",
      "INFO:absl:MetadataStore with DB connection initialized\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object expanded\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">ExecutionResult</span><span class=\"deemphasize\"> at 0x7fca1e900c50</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.execution_id</td><td class = \"attrvalue\">4</td></tr><tr><td class=\"attr-name\">.component</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">ExampleValidator</span><span class=\"deemphasize\"> at 0x7fca1e81b590</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.inputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['statistics']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca45d812d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ExampleStatistics</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/StatisticsGen/statistics/2)<span class=\"deemphasize\"> at 0x7fca1e79f4d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ExampleStatistics&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/StatisticsGen/statistics/2</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;train&quot;, &quot;eval&quot;]</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['schema']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Schema'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e7d35d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Schema</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Schema'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3)<span class=\"deemphasize\"> at 0x7fca45729f10</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Schema&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.outputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['anomalies']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ExampleAnomalies'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e7d31d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ExampleAnomalies</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ExampleAnomalies'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/ExampleValidator/anomalies/4)<span class=\"deemphasize\"> at 0x7fca45b61b10</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ExampleAnomalies&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/ExampleValidator/anomalies/4</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;train&quot;, &quot;eval&quot;]</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.exec_properties</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['exclude_splits']</td><td class = \"attrvalue\">[]</td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">.component.inputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['statistics']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca45d812d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ExampleStatistics</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/StatisticsGen/statistics/2)<span class=\"deemphasize\"> at 0x7fca1e79f4d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ExampleStatistics&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/StatisticsGen/statistics/2</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;train&quot;, &quot;eval&quot;]</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['schema']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Schema'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e7d35d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Schema</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Schema'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3)<span class=\"deemphasize\"> at 0x7fca45729f10</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Schema&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.component.outputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['anomalies']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ExampleAnomalies'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e7d31d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ExampleAnomalies</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ExampleAnomalies'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/ExampleValidator/anomalies/4)<span class=\"deemphasize\"> at 0x7fca45b61b10</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ExampleAnomalies&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/ExampleValidator/anomalies/4</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;train&quot;, &quot;eval&quot;]</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr></table></div>"
      ],
      "text/plain": [
       "ExecutionResult(\n",
       "    component_id: ExampleValidator\n",
       "    execution_id: 4\n",
       "    outputs:\n",
       "        anomalies: OutputChannel(artifact_type=ExampleAnomalies, producer_component_id=ExampleValidator, output_key=anomalies, additional_properties={}, additional_custom_properties={}))"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "example_validator = tfx.components.ExampleValidator(\n",
    "    statistics=statistics_gen.outputs['statistics'],\n",
    "    schema=schema_gen.outputs['schema'])\n",
    "context.run(example_validator, enable_cache=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "855mrHgJcoer"
   },
   "source": [
    "After `ExampleValidator` finishes running, you can visualize the anomalies as a table."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "id": "TDyAAozQcrk3"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<b>Artifact at /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/ExampleValidator/anomalies/4</b><br/><br/>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div><b>'train' split:</b></div><br/>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<h4 style=\"color:green;\">No anomalies found.</h4>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div><b>'eval' split:</b></div><br/>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<h4 style=\"color:green;\">No anomalies found.</h4>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "context.show(example_validator.outputs['anomalies'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "znMoJj60ybZx"
   },
   "source": [
    "In the anomalies table, you can see that there are no anomalies. This is what you'd expect, since this the first dataset that you've analyzed and the schema is tailored to it. You should review this schema -- anything unexpected means an anomaly in the data. Once reviewed, the schema can be used to guard future data, and anomalies produced here can be used to debug model performance, understand how your data evolves over time, and identify data errors."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "JPViEz5RlA36"
   },
   "source": [
    "### Transform\n",
    "The `Transform` component performs feature engineering for both training and serving. It uses the [TensorFlow Transform](https://www.tensorflow.org/tfx/transform/get_started) library.\n",
    "\n",
    "`Transform` will take as input the data from `ExampleGen`, the schema from `SchemaGen`, as well as a module that contains user-defined Transform code.\n",
    "\n",
    "Let's see an example of user-defined Transform code below (for an introduction to the TensorFlow Transform APIs, [see the tutorial](https://www.tensorflow.org/tfx/tutorials/transform/simple)). First, you define a few constants for feature engineering:\n",
    "\n",
    "Note: The `%%writefile` cell magic will save the contents of the cell as a `.py` file on disk. This allows the `Transform` component to load your code as a module.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "id": "PuNSiUKb4YJf"
   },
   "outputs": [],
   "source": [
    "_taxi_constants_module_file = 'taxi_constants.py'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "id": "HPjhXuIF4YJh"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Writing taxi_constants.py\n"
     ]
    }
   ],
   "source": [
    "%%writefile {_taxi_constants_module_file}\n",
    "\n",
    "NUMERICAL_FEATURES = ['trip_miles', 'fare', 'trip_seconds']\n",
    "\n",
    "BUCKET_FEATURES = [\n",
    "    'pickup_latitude', 'pickup_longitude', 'dropoff_latitude',\n",
    "    'dropoff_longitude'\n",
    "]\n",
    "# Number of buckets used by tf.transform for encoding each feature.\n",
    "FEATURE_BUCKET_COUNT = 10\n",
    "\n",
    "CATEGORICAL_NUMERICAL_FEATURES = [\n",
    "    'trip_start_hour', 'trip_start_day', 'trip_start_month',\n",
    "    'pickup_census_tract', 'dropoff_census_tract', 'pickup_community_area',\n",
    "    'dropoff_community_area'\n",
    "]\n",
    "\n",
    "CATEGORICAL_STRING_FEATURES = [\n",
    "    'payment_type',\n",
    "    'company',\n",
    "]\n",
    "\n",
    "# Number of vocabulary terms used for encoding categorical features.\n",
    "VOCAB_SIZE = 1000\n",
    "\n",
    "# Count of out-of-vocab buckets in which unrecognized categorical are hashed.\n",
    "OOV_SIZE = 10\n",
    "\n",
    "# Keys\n",
    "LABEL_KEY = 'tips'\n",
    "FARE_KEY = 'fare'\n",
    "\n",
    "def t_name(key):\n",
    "  \"\"\"\n",
    "  Rename the feature keys so that they don't clash with the raw keys when\n",
    "  running the Evaluator component.\n",
    "  Args:\n",
    "    key: The original feature key\n",
    "  Returns:\n",
    "    key with '_xf' appended\n",
    "  \"\"\"\n",
    "  return key + '_xf'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Duj2Ax5z4YJl"
   },
   "source": [
    "Next, you write a `preprocessing_fn` that takes in raw data as input, and returns transformed features that your model can train on:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "id": "4AJ9hBs94YJm"
   },
   "outputs": [],
   "source": [
    "_taxi_transform_module_file = 'taxi_transform.py'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "id": "MYmxxx9A4YJn"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Writing taxi_transform.py\n"
     ]
    }
   ],
   "source": [
    "%%writefile {_taxi_transform_module_file}\n",
    "\n",
    "import tensorflow as tf\n",
    "import tensorflow_transform as tft\n",
    "\n",
    "# Imported files such as taxi_constants are normally cached, so changes are\n",
    "# not honored after the first import.  Normally this is good for efficiency, but\n",
    "# during development when you may be iterating code it can be a problem. To\n",
    "# avoid this problem during development, reload the file.\n",
    "import taxi_constants\n",
    "import sys\n",
    "if 'google.colab' in sys.modules:  # Testing to see if you're doing development\n",
    "  import importlib\n",
    "  importlib.reload(taxi_constants)\n",
    "\n",
    "_NUMERICAL_FEATURES = taxi_constants.NUMERICAL_FEATURES\n",
    "_BUCKET_FEATURES = taxi_constants.BUCKET_FEATURES\n",
    "_FEATURE_BUCKET_COUNT = taxi_constants.FEATURE_BUCKET_COUNT\n",
    "_CATEGORICAL_NUMERICAL_FEATURES = taxi_constants.CATEGORICAL_NUMERICAL_FEATURES\n",
    "_CATEGORICAL_STRING_FEATURES = taxi_constants.CATEGORICAL_STRING_FEATURES\n",
    "_VOCAB_SIZE = taxi_constants.VOCAB_SIZE\n",
    "_OOV_SIZE = taxi_constants.OOV_SIZE\n",
    "_FARE_KEY = taxi_constants.FARE_KEY\n",
    "_LABEL_KEY = taxi_constants.LABEL_KEY\n",
    "\n",
    "\n",
    "def _make_one_hot(x, key):\n",
    "  \"\"\"Make a one-hot tensor to encode categorical features.\n",
    "  Args:\n",
    "    X: A dense tensor\n",
    "    key: A string key for the feature in the input\n",
    "  Returns:\n",
    "    A dense one-hot tensor as a float list\n",
    "  \"\"\"\n",
    "  integerized = tft.compute_and_apply_vocabulary(x,\n",
    "          top_k=_VOCAB_SIZE,\n",
    "          num_oov_buckets=_OOV_SIZE,\n",
    "          vocab_filename=key, name=key)\n",
    "  depth = (\n",
    "      tft.experimental.get_vocabulary_size_by_name(key) + _OOV_SIZE)\n",
    "  one_hot_encoded = tf.one_hot(\n",
    "      integerized,\n",
    "      depth=tf.cast(depth, tf.int32),\n",
    "      on_value=1.0,\n",
    "      off_value=0.0)\n",
    "  return tf.reshape(one_hot_encoded, [-1, depth])\n",
    "\n",
    "\n",
    "def _fill_in_missing(x):\n",
    "  \"\"\"Replace missing values in a SparseTensor.\n",
    "  Fills in missing values of `x` with '' or 0, and converts to a dense tensor.\n",
    "  Args:\n",
    "    x: A `SparseTensor` of rank 2.  Its dense shape should have size at most 1\n",
    "      in the second dimension.\n",
    "  Returns:\n",
    "    A rank 1 tensor where missing values of `x` have been filled in.\n",
    "  \"\"\"\n",
    "  if not isinstance(x, tf.sparse.SparseTensor):\n",
    "    return x\n",
    "\n",
    "  default_value = '' if x.dtype == tf.string else 0\n",
    "  return tf.squeeze(\n",
    "      tf.sparse.to_dense(\n",
    "          tf.SparseTensor(x.indices, x.values, [x.dense_shape[0], 1]),\n",
    "          default_value),\n",
    "      axis=1)\n",
    "\n",
    "\n",
    "def preprocessing_fn(inputs):\n",
    "  \"\"\"tf.transform's callback function for preprocessing inputs.\n",
    "  Args:\n",
    "    inputs: map from feature keys to raw not-yet-transformed features.\n",
    "  Returns:\n",
    "    Map from string feature key to transformed feature operations.\n",
    "  \"\"\"\n",
    "  outputs = {}\n",
    "  for key in _NUMERICAL_FEATURES:\n",
    "    # If sparse make it dense, setting nan's to 0 or '', and apply zscore.\n",
    "    outputs[taxi_constants.t_name(key)] = tft.scale_to_z_score(\n",
    "        _fill_in_missing(inputs[key]), name=key)\n",
    "\n",
    "  for key in _BUCKET_FEATURES:\n",
    "    outputs[taxi_constants.t_name(key)] = tf.cast(tft.bucketize(\n",
    "            _fill_in_missing(inputs[key]), _FEATURE_BUCKET_COUNT, name=key),\n",
    "            dtype=tf.float32)\n",
    "\n",
    "  for key in _CATEGORICAL_STRING_FEATURES:\n",
    "    outputs[taxi_constants.t_name(key)] = _make_one_hot(_fill_in_missing(inputs[key]), key)\n",
    "\n",
    "  for key in _CATEGORICAL_NUMERICAL_FEATURES:\n",
    "    outputs[taxi_constants.t_name(key)] = _make_one_hot(tf.strings.strip(\n",
    "        tf.strings.as_string(_fill_in_missing(inputs[key]))), key)\n",
    "\n",
    "  # Was this passenger a big tipper?\n",
    "  taxi_fare = _fill_in_missing(inputs[_FARE_KEY])\n",
    "  tips = _fill_in_missing(inputs[_LABEL_KEY])\n",
    "  outputs[_LABEL_KEY] = tf.where(\n",
    "      tf.math.is_nan(taxi_fare),\n",
    "      tf.cast(tf.zeros_like(taxi_fare), tf.int64),\n",
    "      # Test if the tip was > 20% of the fare.\n",
    "      tf.cast(\n",
    "          tf.greater(tips, tf.multiply(taxi_fare, tf.constant(0.2))), tf.int64))\n",
    "\n",
    "  return outputs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "wgbmZr3sgbWW"
   },
   "source": [
    "Now, you pass in this feature engineering code to the `Transform` component and run it to transform your data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "id": "jHfhth_GiZI9"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Generating ephemeral wheel package for '/home/jupyter/taxi_transform.py' (including modules: ['taxi_transform', 'taxi_constants']).\n",
      "INFO:absl:User module package has hash fingerprint version d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d.\n",
      "INFO:absl:Executing: ['/opt/conda/bin/python', '/tmp/tmpygqc9ib_/_tfx_generated_setup.py', 'bdist_wheel', '--bdist-dir', '/tmp/tmpmo3z3brn', '--dist-dir', '/tmp/tmpm8b3clrh']\n",
      "/opt/conda/lib/python3.7/site-packages/setuptools/command/install.py:37: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.\n",
      "  setuptools.SetuptoolsDeprecationWarning,\n",
      "INFO:absl:Successfully built user code wheel distribution at '/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl'; target user module is 'taxi_transform'.\n",
      "INFO:absl:Full user module path is 'taxi_transform@/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl'\n",
      "INFO:absl:Running driver for Transform\n",
      "INFO:absl:MetadataStore with DB connection initialized\n",
      "INFO:absl:Running executor for Transform\n",
      "INFO:absl:Analyze the 'train' split and transform all splits when splits_config is not set.\n",
      "INFO:absl:udf_utils.get_fn {'module_file': None, 'module_path': 'taxi_transform@/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl', 'preprocessing_fn': None} 'preprocessing_fn'\n",
      "INFO:absl:Installing '/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl' to a temporary directory.\n",
      "INFO:absl:Executing: ['/opt/conda/bin/python', '-m', 'pip', 'install', '--target', '/tmp/tmp05a2mz_y', '/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl']\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "running bdist_wheel\n",
      "running build\n",
      "running build_py\n",
      "creating build\n",
      "creating build/lib\n",
      "copying taxi_transform.py -> build/lib\n",
      "copying taxi_constants.py -> build/lib\n",
      "installing to /tmp/tmpmo3z3brn\n",
      "running install\n",
      "running install_lib\n",
      "copying build/lib/taxi_transform.py -> /tmp/tmpmo3z3brn\n",
      "copying build/lib/taxi_constants.py -> /tmp/tmpmo3z3brn\n",
      "running install_egg_info\n",
      "running egg_info\n",
      "creating tfx_user_code_Transform.egg-info\n",
      "writing tfx_user_code_Transform.egg-info/PKG-INFO\n",
      "writing dependency_links to tfx_user_code_Transform.egg-info/dependency_links.txt\n",
      "writing top-level names to tfx_user_code_Transform.egg-info/top_level.txt\n",
      "writing manifest file 'tfx_user_code_Transform.egg-info/SOURCES.txt'\n",
      "reading manifest file 'tfx_user_code_Transform.egg-info/SOURCES.txt'\n",
      "writing manifest file 'tfx_user_code_Transform.egg-info/SOURCES.txt'\n",
      "Copying tfx_user_code_Transform.egg-info to /tmp/tmpmo3z3brn/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3.7.egg-info\n",
      "running install_scripts\n",
      "creating /tmp/tmpmo3z3brn/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d.dist-info/WHEEL\n",
      "creating '/tmp/tmpm8b3clrh/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl' and adding '/tmp/tmpmo3z3brn' to it\n",
      "adding 'taxi_constants.py'\n",
      "adding 'taxi_transform.py'\n",
      "adding 'tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d.dist-info/METADATA'\n",
      "adding 'tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d.dist-info/WHEEL'\n",
      "adding 'tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d.dist-info/top_level.txt'\n",
      "adding 'tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d.dist-info/RECORD'\n",
      "removing /tmp/tmpmo3z3brn\n",
      "Processing /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Successfully installed '/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl'.\n",
      "INFO:absl:udf_utils.get_fn {'module_file': None, 'module_path': 'taxi_transform@/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl', 'stats_options_updater_fn': None} 'stats_options_updater_fn'\n",
      "INFO:absl:Installing '/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl' to a temporary directory.\n",
      "INFO:absl:Executing: ['/opt/conda/bin/python', '-m', 'pip', 'install', '--target', '/tmp/tmpujaoso7l', '/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl']\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Installing collected packages: tfx-user-code-Transform\n",
      "Successfully installed tfx-user-code-Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d\n",
      "Processing /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Successfully installed '/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl'.\n",
      "INFO:absl:Installing '/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl' to a temporary directory.\n",
      "INFO:absl:Executing: ['/opt/conda/bin/python', '-m', 'pip', 'install', '--target', '/tmp/tmp5ew47mwl', '/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl']\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Installing collected packages: tfx-user-code-Transform\n",
      "Successfully installed tfx-user-code-Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d\n",
      "Processing /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Successfully installed '/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl'.\n",
      "INFO:absl:Feature company has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature payment_type has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_census_tract has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_community_area has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_latitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_longitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature fare has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_census_tract has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_community_area has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_latitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_longitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature tips has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_miles has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_seconds has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_day has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_hour has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_month has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_timestamp has no shape. Setting to VarLenSparseTensor.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Installing collected packages: tfx-user-code-Transform\n",
      "Successfully installed tfx-user-code-Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_transform/tf_utils.py:325: Tensor.experimental_ref (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use ref() instead.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Feature company has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature payment_type has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_census_tract has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_community_area has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_latitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_longitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature fare has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_census_tract has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_community_area has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_latitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_longitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature tips has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_miles has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_seconds has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_day has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_hour has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_month has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_timestamp has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:Feature company has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature payment_type has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_census_tract has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_community_area has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_latitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_longitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature fare has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_census_tract has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_community_area has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_latitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_longitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature tips has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_miles has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_seconds has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_day has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_hour has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_month has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_timestamp has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature company has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature payment_type has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_census_tract has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_community_area has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_latitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_longitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature fare has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_census_tract has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_community_area has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_latitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_longitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature tips has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_miles has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_seconds has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_day has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_hour has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_month has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_timestamp has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature company has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature payment_type has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_census_tract has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_community_area has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_latitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_longitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature fare has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_census_tract has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_community_area has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_latitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_longitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature tips has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_miles has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_seconds has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_day has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_hour has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_month has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_timestamp has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature company has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature payment_type has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_census_tract has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_community_area has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_latitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_longitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature fare has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_census_tract has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_community_area has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_latitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_longitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature tips has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_miles has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_seconds has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_day has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_hour has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_month has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_timestamp has no shape. Setting to VarLenSparseTensor.\n",
      "WARNING:root:This output type hint will be ignored and not used for type-checking purposes. Typically, output type hints for a PTransform are single (or nested) types wrapped by a PCollection, PDone, or None. Got: Tuple[Dict[str, Union[NoneType, _Dataset]], Union[Dict[str, Dict[str, PCollection]], NoneType], int] instead.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: payment_type/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: company/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: trip_start_hour/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: trip_start_day/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: trip_start_month/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: pickup_census_tract/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: dropoff_census_tract/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: pickup_community_area/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: dropoff_community_area/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: payment_type/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: company/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: trip_start_hour/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: trip_start_day/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: trip_start_month/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: pickup_census_tract/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: dropoff_census_tract/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: pickup_community_area/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:absl:Tables initialized inside a tf.function  will be re-initialized on every invocation of the function. This  re-initialization can have significant impact on performance. Consider lifting  them out of the graph context using  `tf.init_scope`.: dropoff_community_area/apply_vocab/text_file_init/InitializeTableFromTextFileV2\n",
      "WARNING:root:This output type hint will be ignored and not used for type-checking purposes. Typically, output type hints for a PTransform are single (or nested) types wrapped by a PCollection, PDone, or None. Got: Tuple[Dict[str, Union[NoneType, _Dataset]], Union[Dict[str, Dict[str, PCollection]], NoneType], int] instead.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:Feature company has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature payment_type has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_census_tract has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_community_area has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_latitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_longitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature fare has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_census_tract has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_community_area has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_latitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_longitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature tips has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_miles has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_seconds has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_day has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_hour has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_month has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_timestamp has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature company has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature payment_type has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_census_tract has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_community_area has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_latitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature dropoff_longitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature fare has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_census_tract has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_community_area has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_latitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature pickup_longitude has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature tips has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_miles has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_seconds has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_day has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_hour has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_month has no shape. Setting to VarLenSparseTensor.\n",
      "INFO:absl:Feature trip_start_timestamp has no shape. Setting to VarLenSparseTensor.\n",
      "WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "2022-05-12 18:21:33.565891: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Assets written to: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transform_graph/5/.temp_path/tftransform_tmp/2034ac4efe9b44f092d62195419034d4/assets\n",
      "INFO:tensorflow:struct2tensor is not available.\n",
      "INFO:tensorflow:tensorflow_decision_forests is not available.\n",
      "INFO:tensorflow:tensorflow_text is not available.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Assets written to: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transform_graph/5/.temp_path/tftransform_tmp/8dd6e4f1ba8646ed922f8d3fe0845451/assets\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n",
      "INFO:absl:If the number of unique tokens is smaller than the provided top_k or approximation error is acceptable, consider using tft.experimental.approximate_vocabulary for a potentially more efficient implementation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:struct2tensor is not available.\n",
      "INFO:tensorflow:tensorflow_decision_forests is not available.\n",
      "INFO:tensorflow:tensorflow_text is not available.\n",
      "INFO:tensorflow:struct2tensor is not available.\n",
      "INFO:tensorflow:tensorflow_decision_forests is not available.\n",
      "INFO:tensorflow:tensorflow_text is not available.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Running publisher for Transform\n",
      "INFO:absl:MetadataStore with DB connection initialized\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object expanded\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">ExecutionResult</span><span class=\"deemphasize\"> at 0x7fca456de910</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.execution_id</td><td class = \"attrvalue\">5</td></tr><tr><td class=\"attr-name\">.component</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Transform</span><span class=\"deemphasize\"> at 0x7fca45d81f10</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.inputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['examples']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Examples'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1eaa3ad0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Examples</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Examples'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1)<span class=\"deemphasize\"> at 0x7fca1ea89c90</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Examples&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;train&quot;, &quot;eval&quot;]</td></tr><tr><td class=\"attr-name\">.version</td><td class = \"attrvalue\">0</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['schema']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Schema'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e7d35d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Schema</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Schema'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3)<span class=\"deemphasize\"> at 0x7fca45729f10</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Schema&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.outputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['transform_graph']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'TransformGraph'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca45d81fd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">TransformGraph</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'TransformGraph'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transform_graph/5)<span class=\"deemphasize\"> at 0x7fca8f857fd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.TransformGraph&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transform_graph/5</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['transformed_examples']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Examples'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca45d81cd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Examples</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Examples'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transformed_examples/5)<span class=\"deemphasize\"> at 0x7fca8f861890</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Examples&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transformed_examples/5</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;eval&quot;, &quot;train&quot;]</td></tr><tr><td class=\"attr-name\">.version</td><td class = \"attrvalue\">0</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['updated_analyzer_cache']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'TransformCache'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca45d818d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">TransformCache</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'TransformCache'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/updated_analyzer_cache/5)<span class=\"deemphasize\"> at 0x7fca8f861710</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.TransformCache&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/updated_analyzer_cache/5</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['pre_transform_schema']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Schema'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e836490</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Schema</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Schema'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/pre_transform_schema/5)<span class=\"deemphasize\"> at 0x7fca8f861790</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Schema&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/pre_transform_schema/5</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['pre_transform_stats']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e8362d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ExampleStatistics</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/pre_transform_stats/5)<span class=\"deemphasize\"> at 0x7fca8f8613d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ExampleStatistics&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/pre_transform_stats/5</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\"></td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['post_transform_schema']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Schema'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e836fd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Schema</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Schema'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/post_transform_schema/5)<span class=\"deemphasize\"> at 0x7fca8f861650</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Schema&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/post_transform_schema/5</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['post_transform_stats']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e836c50</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ExampleStatistics</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/post_transform_stats/5)<span class=\"deemphasize\"> at 0x7fca8f861310</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ExampleStatistics&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/post_transform_stats/5</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\"></td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['post_transform_anomalies']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ExampleAnomalies'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e836ed0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ExampleAnomalies</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ExampleAnomalies'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/post_transform_anomalies/5)<span class=\"deemphasize\"> at 0x7fca45d81110</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ExampleAnomalies&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/post_transform_anomalies/5</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\"></td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.exec_properties</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['module_file']</td><td class = \"attrvalue\">None</td></tr><tr><td class=\"attr-name\">['preprocessing_fn']</td><td class = \"attrvalue\">None</td></tr><tr><td class=\"attr-name\">['stats_options_updater_fn']</td><td class = \"attrvalue\">None</td></tr><tr><td class=\"attr-name\">['force_tf_compat_v1']</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">['custom_config']</td><td class = \"attrvalue\">null</td></tr><tr><td class=\"attr-name\">['splits_config']</td><td class = \"attrvalue\">None</td></tr><tr><td class=\"attr-name\">['disable_statistics']</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">['module_path']</td><td class = \"attrvalue\">taxi_transform@/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Transform-0.0+d7f32accc04453d93cd29bae5b4d879eb83d8a54c7e01d354a58158f2f84251d-py3-none-any.whl</td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">.component.inputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['examples']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Examples'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1eaa3ad0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Examples</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Examples'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1)<span class=\"deemphasize\"> at 0x7fca1ea89c90</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Examples&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;train&quot;, &quot;eval&quot;]</td></tr><tr><td class=\"attr-name\">.version</td><td class = \"attrvalue\">0</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['schema']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Schema'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e7d35d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Schema</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Schema'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3)<span class=\"deemphasize\"> at 0x7fca45729f10</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Schema&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.component.outputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['transform_graph']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'TransformGraph'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca45d81fd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">TransformGraph</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'TransformGraph'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transform_graph/5)<span class=\"deemphasize\"> at 0x7fca8f857fd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.TransformGraph&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transform_graph/5</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['transformed_examples']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Examples'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca45d81cd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Examples</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Examples'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transformed_examples/5)<span class=\"deemphasize\"> at 0x7fca8f861890</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Examples&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transformed_examples/5</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;eval&quot;, &quot;train&quot;]</td></tr><tr><td class=\"attr-name\">.version</td><td class = \"attrvalue\">0</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['updated_analyzer_cache']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'TransformCache'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca45d818d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">TransformCache</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'TransformCache'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/updated_analyzer_cache/5)<span class=\"deemphasize\"> at 0x7fca8f861710</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.TransformCache&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/updated_analyzer_cache/5</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['pre_transform_schema']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Schema'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e836490</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Schema</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Schema'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/pre_transform_schema/5)<span class=\"deemphasize\"> at 0x7fca8f861790</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Schema&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/pre_transform_schema/5</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['pre_transform_stats']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e8362d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ExampleStatistics</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/pre_transform_stats/5)<span class=\"deemphasize\"> at 0x7fca8f8613d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ExampleStatistics&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/pre_transform_stats/5</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\"></td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['post_transform_schema']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Schema'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e836fd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Schema</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Schema'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/post_transform_schema/5)<span class=\"deemphasize\"> at 0x7fca8f861650</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Schema&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/post_transform_schema/5</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['post_transform_stats']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e836c50</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ExampleStatistics</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ExampleStatistics'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/post_transform_stats/5)<span class=\"deemphasize\"> at 0x7fca8f861310</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ExampleStatistics&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/post_transform_stats/5</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\"></td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['post_transform_anomalies']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ExampleAnomalies'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e836ed0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ExampleAnomalies</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ExampleAnomalies'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/post_transform_anomalies/5)<span class=\"deemphasize\"> at 0x7fca45d81110</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ExampleAnomalies&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/post_transform_anomalies/5</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\"></td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr></table></div>"
      ],
      "text/plain": [
       "ExecutionResult(\n",
       "    component_id: Transform\n",
       "    execution_id: 5\n",
       "    outputs:\n",
       "        transform_graph: OutputChannel(artifact_type=TransformGraph, producer_component_id=Transform, output_key=transform_graph, additional_properties={}, additional_custom_properties={})\n",
       "        transformed_examples: OutputChannel(artifact_type=Examples, producer_component_id=Transform, output_key=transformed_examples, additional_properties={}, additional_custom_properties={})\n",
       "        updated_analyzer_cache: OutputChannel(artifact_type=TransformCache, producer_component_id=Transform, output_key=updated_analyzer_cache, additional_properties={}, additional_custom_properties={})\n",
       "        pre_transform_schema: OutputChannel(artifact_type=Schema, producer_component_id=Transform, output_key=pre_transform_schema, additional_properties={}, additional_custom_properties={})\n",
       "        pre_transform_stats: OutputChannel(artifact_type=ExampleStatistics, producer_component_id=Transform, output_key=pre_transform_stats, additional_properties={}, additional_custom_properties={})\n",
       "        post_transform_schema: OutputChannel(artifact_type=Schema, producer_component_id=Transform, output_key=post_transform_schema, additional_properties={}, additional_custom_properties={})\n",
       "        post_transform_stats: OutputChannel(artifact_type=ExampleStatistics, producer_component_id=Transform, output_key=post_transform_stats, additional_properties={}, additional_custom_properties={})\n",
       "        post_transform_anomalies: OutputChannel(artifact_type=ExampleAnomalies, producer_component_id=Transform, output_key=post_transform_anomalies, additional_properties={}, additional_custom_properties={}))"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "transform = tfx.components.Transform(\n",
    "    examples=example_gen.outputs['examples'],\n",
    "    schema=schema_gen.outputs['schema'],\n",
    "    module_file=os.path.abspath(_taxi_transform_module_file))\n",
    "context.run(transform, enable_cache=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "fwAwb4rARRQ2"
   },
   "source": [
    "Let's examine the output artifacts of `Transform`. This component produces two types of outputs:\n",
    "\n",
    "* `transform_graph` is the graph that can perform the preprocessing operations (this graph will be included in the serving and evaluation models).\n",
    "* `transformed_examples` represents the preprocessed training and evaluation data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "id": "SClrAaEGR1O5"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'transform_graph': OutputChannel(artifact_type=TransformGraph, producer_component_id=Transform, output_key=transform_graph, additional_properties={}, additional_custom_properties={}),\n",
       " 'transformed_examples': OutputChannel(artifact_type=Examples, producer_component_id=Transform, output_key=transformed_examples, additional_properties={}, additional_custom_properties={}),\n",
       " 'updated_analyzer_cache': OutputChannel(artifact_type=TransformCache, producer_component_id=Transform, output_key=updated_analyzer_cache, additional_properties={}, additional_custom_properties={}),\n",
       " 'pre_transform_schema': OutputChannel(artifact_type=Schema, producer_component_id=Transform, output_key=pre_transform_schema, additional_properties={}, additional_custom_properties={}),\n",
       " 'pre_transform_stats': OutputChannel(artifact_type=ExampleStatistics, producer_component_id=Transform, output_key=pre_transform_stats, additional_properties={}, additional_custom_properties={}),\n",
       " 'post_transform_schema': OutputChannel(artifact_type=Schema, producer_component_id=Transform, output_key=post_transform_schema, additional_properties={}, additional_custom_properties={}),\n",
       " 'post_transform_stats': OutputChannel(artifact_type=ExampleStatistics, producer_component_id=Transform, output_key=post_transform_stats, additional_properties={}, additional_custom_properties={}),\n",
       " 'post_transform_anomalies': OutputChannel(artifact_type=ExampleAnomalies, producer_component_id=Transform, output_key=post_transform_anomalies, additional_properties={}, additional_custom_properties={})}"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "transform.outputs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "vyFkBd9AR1sy"
   },
   "source": [
    "Take a peek at the `transform_graph` artifact.  It points to a directory containing three subdirectories."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "id": "5tRw4DneR3i7"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['metadata', 'transform_fn', 'transformed_metadata']"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_uri = transform.outputs['transform_graph'].get()[0].uri\n",
    "os.listdir(train_uri)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4fqV54CIR6Pu"
   },
   "source": [
    "The `transformed_metadata` subdirectory contains the schema of the preprocessed data. The `transform_fn` subdirectory contains the actual preprocessing graph. The `metadata` subdirectory contains the schema of the original data.\n",
    "\n",
    "You can also take a look at the first three transformed examples:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "id": "pwbW2zPKR_S4"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "features {\n",
      "  feature {\n",
      "    key: \"company_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_census_tract_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_community_area_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_latitude_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_longitude_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 9.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"fare_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.06106060370802879\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"payment_type_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_census_tract_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_community_area_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_latitude_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_longitude_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 9.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"tips\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_miles_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: -0.15886740386486053\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_seconds_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: -0.7118487358093262\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_day_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_hour_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_month_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "}\n",
      "\n",
      "features {\n",
      "  feature {\n",
      "    key: \"company_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_census_tract_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_community_area_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_latitude_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_longitude_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 9.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"fare_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 1.2521241903305054\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"payment_type_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_census_tract_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_community_area_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_latitude_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_longitude_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 3.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"tips\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_miles_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.532160758972168\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_seconds_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.5509493350982666\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_day_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_hour_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_month_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "}\n",
      "\n",
      "features {\n",
      "  feature {\n",
      "    key: \"company_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_census_tract_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_community_area_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_latitude_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"dropoff_longitude_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 9.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"fare_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.3873794674873352\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"payment_type_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_census_tract_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_community_area_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_latitude_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 9.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"pickup_longitude_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"tips\"\n",
      "    value {\n",
      "      int64_list {\n",
      "        value: 0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_miles_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.21955278515815735\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_seconds_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0019067146349698305\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_day_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_hour_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  feature {\n",
      "    key: \"trip_start_month_xf\"\n",
      "    value {\n",
      "      float_list {\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 1.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "        value: 0.0\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# Get the URI of the output artifact representing the transformed examples, which is a directory\n",
    "train_uri = os.path.join(transform.outputs['transformed_examples'].get()[0].uri, 'Split-train')\n",
    "\n",
    "# Get the list of files in this directory (all compressed TFRecord files)\n",
    "tfrecord_filenames = [os.path.join(train_uri, name)\n",
    "                      for name in os.listdir(train_uri)]\n",
    "\n",
    "# Create a `TFRecordDataset` to read these files\n",
    "dataset = tf.data.TFRecordDataset(tfrecord_filenames, compression_type=\"GZIP\")\n",
    "\n",
    "# Iterate over the first 3 records and decode them.\n",
    "for tfrecord in dataset.take(3):\n",
    "  serialized_example = tfrecord.numpy()\n",
    "  example = tf.train.Example()\n",
    "  example.ParseFromString(serialized_example)\n",
    "  pp.pprint(example)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "q_b_V6eN4f69"
   },
   "source": [
    "After the `Transform` component has transformed your data into features, and the next step is to train a model."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "OBJFtnl6lCg9"
   },
   "source": [
    "### Trainer\n",
    "The `Trainer` component will train a model that you define in TensorFlow. Default Trainer support Estimator API, to use Keras API, you need to specify [Generic Trainer](https://github.com/tensorflow/community/blob/master/rfcs/20200117-tfx-generic-trainer.md) by setup `custom_executor_spec=executor_spec.ExecutorClassSpec(GenericExecutor)` in Trainer's contructor.\n",
    "\n",
    "`Trainer` takes as input the schema from `SchemaGen`, the transformed data and graph from `Transform`, training parameters, as well as a module that contains user-defined model code.\n",
    "\n",
    "Let's see an example of user-defined model code below (for an introduction to the TensorFlow Keras APIs, [see the tutorial](https://www.tensorflow.org/guide/keras)):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "id": "N1376oq04YJt"
   },
   "outputs": [],
   "source": [
    "_taxi_trainer_module_file = 'taxi_trainer.py'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "id": "nf9UuNng4YJu"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Writing taxi_trainer.py\n"
     ]
    }
   ],
   "source": [
    "%%writefile {_taxi_trainer_module_file}\n",
    "\n",
    "from typing import Dict, List, Text\n",
    "\n",
    "import os\n",
    "import glob\n",
    "from absl import logging\n",
    "\n",
    "import datetime\n",
    "import tensorflow as tf\n",
    "import tensorflow_transform as tft\n",
    "\n",
    "from tfx import v1 as tfx\n",
    "from tfx_bsl.public import tfxio\n",
    "from tensorflow_transform import TFTransformOutput\n",
    "\n",
    "# Imported files such as taxi_constants are normally cached, so changes are\n",
    "# not honored after the first import.  Normally this is good for efficiency, but\n",
    "# during development when you may be iterating code it can be a problem. To\n",
    "# avoid this problem during development, reload the file.\n",
    "import taxi_constants\n",
    "import sys\n",
    "if 'google.colab' in sys.modules:  # Testing to see if you're doing development\n",
    "  import importlib\n",
    "  importlib.reload(taxi_constants)\n",
    "\n",
    "_LABEL_KEY = taxi_constants.LABEL_KEY\n",
    "\n",
    "_BATCH_SIZE = 40\n",
    "\n",
    "\n",
    "def _input_fn(file_pattern: List[Text],\n",
    "              data_accessor: tfx.components.DataAccessor,\n",
    "              tf_transform_output: tft.TFTransformOutput,\n",
    "              batch_size: int = 200) -> tf.data.Dataset:\n",
    "  \"\"\"Generates features and label for tuning/training.\n",
    "\n",
    "  Args:\n",
    "    file_pattern: List of paths or patterns of input tfrecord files.\n",
    "    data_accessor: DataAccessor for converting input to RecordBatch.\n",
    "    tf_transform_output: A TFTransformOutput.\n",
    "    batch_size: representing the number of consecutive elements of returned\n",
    "      dataset to combine in a single batch\n",
    "\n",
    "  Returns:\n",
    "    A dataset that contains (features, indices) tuple where features is a\n",
    "      dictionary of Tensors, and indices is a single Tensor of label indices.\n",
    "  \"\"\"\n",
    "  return data_accessor.tf_dataset_factory(\n",
    "      file_pattern,\n",
    "      tfxio.TensorFlowDatasetOptions(\n",
    "          batch_size=batch_size, label_key=_LABEL_KEY),\n",
    "      tf_transform_output.transformed_metadata.schema)\n",
    "\n",
    "def _get_tf_examples_serving_signature(model, tf_transform_output):\n",
    "  \"\"\"Returns a serving signature that accepts `tensorflow.Example`.\"\"\"\n",
    "\n",
    "  # You need to track the layers in the model in order to save it.\n",
    "  model.tft_layer_inference = tf_transform_output.transform_features_layer()\n",
    "\n",
    "  @tf.function(input_signature=[\n",
    "      tf.TensorSpec(shape=[None], dtype=tf.string, name='examples')\n",
    "  ])\n",
    "  def serve_tf_examples_fn(serialized_tf_example):\n",
    "    \"\"\"Returns the output to be used in the serving signature.\"\"\"\n",
    "    raw_feature_spec = tf_transform_output.raw_feature_spec()\n",
    "    # Remove label feature since these will not be present at serving time.\n",
    "    raw_feature_spec.pop(_LABEL_KEY)\n",
    "    raw_features = tf.io.parse_example(serialized_tf_example, raw_feature_spec)\n",
    "    transformed_features = model.tft_layer_inference(raw_features)\n",
    "    logging.info('serve_transformed_features = %s', transformed_features)\n",
    "\n",
    "    outputs = model(transformed_features)\n",
    "    return {'outputs': outputs}\n",
    "\n",
    "  return serve_tf_examples_fn\n",
    "\n",
    "\n",
    "def _get_transform_features_signature(model, tf_transform_output):\n",
    "  \"\"\"Returns a serving signature that applies tf.Transform to features.\"\"\"\n",
    "\n",
    "  # You need to track the layers in the model in order to save it.\n",
    "  model.tft_layer_eval = tf_transform_output.transform_features_layer()\n",
    "\n",
    "  @tf.function(input_signature=[\n",
    "      tf.TensorSpec(shape=[None], dtype=tf.string, name='examples')\n",
    "  ])\n",
    "  def transform_features_fn(serialized_tf_example):\n",
    "    \"\"\"Returns the transformed_features to be fed as input to evaluator.\"\"\"\n",
    "    raw_feature_spec = tf_transform_output.raw_feature_spec()\n",
    "    raw_features = tf.io.parse_example(serialized_tf_example, raw_feature_spec)\n",
    "    transformed_features = model.tft_layer_eval(raw_features)\n",
    "    logging.info('eval_transformed_features = %s', transformed_features)\n",
    "    return transformed_features\n",
    "\n",
    "  return transform_features_fn\n",
    "\n",
    "\n",
    "def export_serving_model(tf_transform_output, model, output_dir):\n",
    "  \"\"\"Exports a keras model for serving.\n",
    "  Args:\n",
    "    tf_transform_output: Wrapper around output of tf.Transform.\n",
    "    model: A keras model to export for serving.\n",
    "    output_dir: A directory where the model will be exported to.\n",
    "  \"\"\"\n",
    "  # The layer has to be saved to the model for keras tracking purpases.\n",
    "  model.tft_layer = tf_transform_output.transform_features_layer()\n",
    "\n",
    "  signatures = {\n",
    "      'serving_default':\n",
    "          _get_tf_examples_serving_signature(model, tf_transform_output),\n",
    "      'transform_features':\n",
    "          _get_transform_features_signature(model, tf_transform_output),\n",
    "  }\n",
    "\n",
    "  model.save(output_dir, save_format='tf', signatures=signatures)\n",
    "\n",
    "\n",
    "def _build_keras_model(tf_transform_output: TFTransformOutput\n",
    "                       ) -> tf.keras.Model:\n",
    "  \"\"\"Creates a DNN Keras model for classifying taxi data.\n",
    "\n",
    "  Args:\n",
    "    tf_transform_output: [TFTransformOutput], the outputs from Transform\n",
    "\n",
    "  Returns:\n",
    "    A keras Model.\n",
    "  \"\"\"\n",
    "  feature_spec = tf_transform_output.transformed_feature_spec().copy()\n",
    "  feature_spec.pop(_LABEL_KEY)\n",
    "\n",
    "  inputs = {}\n",
    "  for key, spec in feature_spec.items():\n",
    "    if isinstance(spec, tf.io.VarLenFeature):\n",
    "      inputs[key] = tf.keras.layers.Input(\n",
    "          shape=[None], name=key, dtype=spec.dtype, sparse=True)\n",
    "    elif isinstance(spec, tf.io.FixedLenFeature):\n",
    "      inputs[key] = tf.keras.layers.Input(\n",
    "          shape=spec.shape or [1], name=key, dtype=spec.dtype)\n",
    "    else:\n",
    "      raise ValueError('Spec type is not supported: ', key, spec)\n",
    "  \n",
    "  output = tf.keras.layers.Concatenate()(tf.nest.flatten(inputs))\n",
    "  output = tf.keras.layers.Dense(100, activation='relu')(output)\n",
    "  output = tf.keras.layers.Dense(70, activation='relu')(output)\n",
    "  output = tf.keras.layers.Dense(50, activation='relu')(output)\n",
    "  output = tf.keras.layers.Dense(20, activation='relu')(output)\n",
    "  output = tf.keras.layers.Dense(1)(output)\n",
    "  return tf.keras.Model(inputs=inputs, outputs=output)\n",
    "\n",
    "\n",
    "# TFX Trainer will call this function.\n",
    "def run_fn(fn_args: tfx.components.FnArgs):\n",
    "  \"\"\"Train the model based on given args.\n",
    "\n",
    "  Args:\n",
    "    fn_args: Holds args used to train the model as name/value pairs.\n",
    "  \"\"\"\n",
    "  tf_transform_output = tft.TFTransformOutput(fn_args.transform_output)\n",
    "\n",
    "  train_dataset = _input_fn(fn_args.train_files, fn_args.data_accessor, \n",
    "                            tf_transform_output, _BATCH_SIZE)\n",
    "  eval_dataset = _input_fn(fn_args.eval_files, fn_args.data_accessor, \n",
    "                           tf_transform_output, _BATCH_SIZE)\n",
    "\n",
    "  model = _build_keras_model(tf_transform_output)\n",
    "\n",
    "  model.compile(\n",
    "      loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),\n",
    "      optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),\n",
    "      metrics=[tf.keras.metrics.BinaryAccuracy()])\n",
    "\n",
    "  tensorboard_callback = tf.keras.callbacks.TensorBoard(\n",
    "      log_dir=fn_args.model_run_dir, update_freq='batch')\n",
    "\n",
    "  model.fit(\n",
    "      train_dataset,\n",
    "      steps_per_epoch=fn_args.train_steps,\n",
    "      validation_data=eval_dataset,\n",
    "      validation_steps=fn_args.eval_steps,\n",
    "      callbacks=[tensorboard_callback])\n",
    "\n",
    "  # Export the model.\n",
    "  export_serving_model(tf_transform_output, model, fn_args.serving_model_dir)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "GY4yTRaX4YJx"
   },
   "source": [
    "Now, you pass in this model code to the `Trainer` component and run it to train the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "id": "429-vvCWibO0"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Generating ephemeral wheel package for '/home/jupyter/taxi_trainer.py' (including modules: ['taxi_transform', 'taxi_trainer', 'taxi_constants']).\n",
      "INFO:absl:User module package has hash fingerprint version b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78.\n",
      "INFO:absl:Executing: ['/opt/conda/bin/python', '/tmp/tmpsms5acvr/_tfx_generated_setup.py', 'bdist_wheel', '--bdist-dir', '/tmp/tmpgee5wde7', '--dist-dir', '/tmp/tmpy6lgcf3_']\n",
      "/opt/conda/lib/python3.7/site-packages/setuptools/command/install.py:37: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.\n",
      "  setuptools.SetuptoolsDeprecationWarning,\n",
      "INFO:absl:Successfully built user code wheel distribution at '/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Trainer-0.0+b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78-py3-none-any.whl'; target user module is 'taxi_trainer'.\n",
      "INFO:absl:Full user module path is 'taxi_trainer@/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Trainer-0.0+b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78-py3-none-any.whl'\n",
      "INFO:absl:Running driver for Trainer\n",
      "INFO:absl:MetadataStore with DB connection initialized\n",
      "INFO:absl:Running executor for Trainer\n",
      "INFO:absl:Train on the 'train' split when train_args.splits is not set.\n",
      "INFO:absl:Evaluate on the 'eval' split when eval_args.splits is not set.\n",
      "WARNING:absl:Examples artifact does not have payload_format custom property. Falling back to FORMAT_TF_EXAMPLE\n",
      "WARNING:absl:Examples artifact does not have payload_format custom property. Falling back to FORMAT_TF_EXAMPLE\n",
      "WARNING:absl:Examples artifact does not have payload_format custom property. Falling back to FORMAT_TF_EXAMPLE\n",
      "INFO:absl:udf_utils.get_fn {'train_args': '{\\n  \"num_steps\": 10000\\n}', 'eval_args': '{\\n  \"num_steps\": 5000\\n}', 'module_file': None, 'run_fn': None, 'trainer_fn': None, 'custom_config': 'null', 'module_path': 'taxi_trainer@/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Trainer-0.0+b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78-py3-none-any.whl'} 'run_fn'\n",
      "INFO:absl:Installing '/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Trainer-0.0+b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78-py3-none-any.whl' to a temporary directory.\n",
      "INFO:absl:Executing: ['/opt/conda/bin/python', '-m', 'pip', 'install', '--target', '/tmp/tmp73yw48v8', '/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Trainer-0.0+b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78-py3-none-any.whl']\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "running bdist_wheel\n",
      "running build\n",
      "running build_py\n",
      "creating build\n",
      "creating build/lib\n",
      "copying taxi_transform.py -> build/lib\n",
      "copying taxi_trainer.py -> build/lib\n",
      "copying taxi_constants.py -> build/lib\n",
      "installing to /tmp/tmpgee5wde7\n",
      "running install\n",
      "running install_lib\n",
      "copying build/lib/taxi_transform.py -> /tmp/tmpgee5wde7\n",
      "copying build/lib/taxi_trainer.py -> /tmp/tmpgee5wde7\n",
      "copying build/lib/taxi_constants.py -> /tmp/tmpgee5wde7\n",
      "running install_egg_info\n",
      "running egg_info\n",
      "creating tfx_user_code_Trainer.egg-info\n",
      "writing tfx_user_code_Trainer.egg-info/PKG-INFO\n",
      "writing dependency_links to tfx_user_code_Trainer.egg-info/dependency_links.txt\n",
      "writing top-level names to tfx_user_code_Trainer.egg-info/top_level.txt\n",
      "writing manifest file 'tfx_user_code_Trainer.egg-info/SOURCES.txt'\n",
      "reading manifest file 'tfx_user_code_Trainer.egg-info/SOURCES.txt'\n",
      "writing manifest file 'tfx_user_code_Trainer.egg-info/SOURCES.txt'\n",
      "Copying tfx_user_code_Trainer.egg-info to /tmp/tmpgee5wde7/tfx_user_code_Trainer-0.0+b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78-py3.7.egg-info\n",
      "running install_scripts\n",
      "creating /tmp/tmpgee5wde7/tfx_user_code_Trainer-0.0+b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78.dist-info/WHEEL\n",
      "creating '/tmp/tmpy6lgcf3_/tfx_user_code_Trainer-0.0+b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78-py3-none-any.whl' and adding '/tmp/tmpgee5wde7' to it\n",
      "adding 'taxi_constants.py'\n",
      "adding 'taxi_trainer.py'\n",
      "adding 'taxi_transform.py'\n",
      "adding 'tfx_user_code_Trainer-0.0+b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78.dist-info/METADATA'\n",
      "adding 'tfx_user_code_Trainer-0.0+b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78.dist-info/WHEEL'\n",
      "adding 'tfx_user_code_Trainer-0.0+b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78.dist-info/top_level.txt'\n",
      "adding 'tfx_user_code_Trainer-0.0+b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78.dist-info/RECORD'\n",
      "removing /tmp/tmpgee5wde7\n",
      "Processing /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Trainer-0.0+b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78-py3-none-any.whl\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Successfully installed '/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Trainer-0.0+b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78-py3-none-any.whl'.\n",
      "INFO:absl:Training model.\n",
      "INFO:absl:Feature company_xf has a shape dim {\n",
      "  size: 55\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature dropoff_census_tract_xf has a shape dim {\n",
      "  size: 216\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature dropoff_community_area_xf has a shape dim {\n",
      "  size: 79\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature dropoff_latitude_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature dropoff_longitude_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature fare_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature payment_type_xf has a shape dim {\n",
      "  size: 16\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature pickup_census_tract_xf has a shape dim {\n",
      "  size: 11\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature pickup_community_area_xf has a shape dim {\n",
      "  size: 66\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature pickup_latitude_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature pickup_longitude_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature tips has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_miles_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_seconds_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_start_day_xf has a shape dim {\n",
      "  size: 17\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_start_hour_xf has a shape dim {\n",
      "  size: 34\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_start_month_xf has a shape dim {\n",
      "  size: 22\n",
      "}\n",
      ". Setting to DenseTensor.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Installing collected packages: tfx-user-code-Trainer\n",
      "Successfully installed tfx-user-code-Trainer-0.0+b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Feature company_xf has a shape dim {\n",
      "  size: 55\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature dropoff_census_tract_xf has a shape dim {\n",
      "  size: 216\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature dropoff_community_area_xf has a shape dim {\n",
      "  size: 79\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature dropoff_latitude_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature dropoff_longitude_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature fare_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature payment_type_xf has a shape dim {\n",
      "  size: 16\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature pickup_census_tract_xf has a shape dim {\n",
      "  size: 11\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature pickup_community_area_xf has a shape dim {\n",
      "  size: 66\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature pickup_latitude_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature pickup_longitude_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature tips has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_miles_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_seconds_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_start_day_xf has a shape dim {\n",
      "  size: 17\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_start_hour_xf has a shape dim {\n",
      "  size: 34\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_start_month_xf has a shape dim {\n",
      "  size: 22\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature company_xf has a shape dim {\n",
      "  size: 55\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature dropoff_census_tract_xf has a shape dim {\n",
      "  size: 216\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature dropoff_community_area_xf has a shape dim {\n",
      "  size: 79\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature dropoff_latitude_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature dropoff_longitude_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature fare_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature payment_type_xf has a shape dim {\n",
      "  size: 16\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature pickup_census_tract_xf has a shape dim {\n",
      "  size: 11\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature pickup_community_area_xf has a shape dim {\n",
      "  size: 66\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature pickup_latitude_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature pickup_longitude_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature tips has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_miles_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_seconds_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_start_day_xf has a shape dim {\n",
      "  size: 17\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_start_hour_xf has a shape dim {\n",
      "  size: 34\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_start_month_xf has a shape dim {\n",
      "  size: 22\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature company_xf has a shape dim {\n",
      "  size: 55\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature dropoff_census_tract_xf has a shape dim {\n",
      "  size: 216\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature dropoff_community_area_xf has a shape dim {\n",
      "  size: 79\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature dropoff_latitude_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature dropoff_longitude_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature fare_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature payment_type_xf has a shape dim {\n",
      "  size: 16\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature pickup_census_tract_xf has a shape dim {\n",
      "  size: 11\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature pickup_community_area_xf has a shape dim {\n",
      "  size: 66\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature pickup_latitude_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature pickup_longitude_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature tips has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_miles_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_seconds_xf has a shape . Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_start_day_xf has a shape dim {\n",
      "  size: 17\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_start_hour_xf has a shape dim {\n",
      "  size: 34\n",
      "}\n",
      ". Setting to DenseTensor.\n",
      "INFO:absl:Feature trip_start_month_xf has a shape dim {\n",
      "  size: 22\n",
      "}\n",
      ". Setting to DenseTensor.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 41s 4ms/step - loss: 0.0894 - binary_accuracy: 0.9570 - val_loss: 1.1173 - val_binary_accuracy: 0.8734\n",
      "INFO:tensorflow:struct2tensor is not available.\n",
      "INFO:tensorflow:tensorflow_decision_forests is not available.\n",
      "INFO:tensorflow:tensorflow_text is not available.\n",
      "WARNING:tensorflow:AutoGraph could not transform <bound method Socket.send of <zmq.Socket(zmq.PUSH) at 0x7fca8f8afd70>> and will run it as-is.\n",
      "Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output.\n",
      "Cause: module, class, method, function, traceback, frame, or code object was expected, got cython_function_or_method\n",
      "To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert\n",
      "WARNING: AutoGraph could not transform <bound method Socket.send of <zmq.Socket(zmq.PUSH) at 0x7fca8f8afd70>> and will run it as-is.\n",
      "Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output.\n",
      "Cause: module, class, method, function, traceback, frame, or code object was expected, got cython_function_or_method\n",
      "To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:serve_transformed_features = {'fare_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:5' shape=(None,) dtype=float32>, 'dropoff_latitude_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:3' shape=(None,) dtype=float32>, 'pickup_latitude_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:9' shape=(None,) dtype=float32>, 'dropoff_community_area_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:2' shape=(None, 79) dtype=float32>, 'dropoff_census_tract_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:1' shape=(None, 216) dtype=float32>, 'trip_start_day_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:14' shape=(None, 17) dtype=float32>, 'pickup_longitude_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:10' shape=(None,) dtype=float32>, 'trip_start_month_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:16' shape=(None, 22) dtype=float32>, 'trip_start_hour_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:15' shape=(None, 34) dtype=float32>, 'company_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:0' shape=(None, 55) dtype=float32>, 'payment_type_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:6' shape=(None, 16) dtype=float32>, 'trip_seconds_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:13' shape=(None,) dtype=float32>, 'pickup_census_tract_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:7' shape=(None, 11) dtype=float32>, 'dropoff_longitude_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:4' shape=(None,) dtype=float32>, 'pickup_community_area_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:8' shape=(None, 66) dtype=float32>, 'trip_miles_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:12' shape=(None,) dtype=float32>}\n",
      "INFO:absl:eval_transformed_features = {'fare_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:5' shape=(None,) dtype=float32>, 'dropoff_latitude_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:3' shape=(None,) dtype=float32>, 'pickup_latitude_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:9' shape=(None,) dtype=float32>, 'dropoff_community_area_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:2' shape=(None, 79) dtype=float32>, 'dropoff_census_tract_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:1' shape=(None, 216) dtype=float32>, 'trip_start_day_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:14' shape=(None, 17) dtype=float32>, 'pickup_longitude_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:10' shape=(None,) dtype=float32>, 'trip_start_month_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:16' shape=(None, 22) dtype=float32>, 'trip_start_hour_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:15' shape=(None, 34) dtype=float32>, 'company_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:0' shape=(None, 55) dtype=float32>, 'payment_type_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:6' shape=(None, 16) dtype=float32>, 'trip_seconds_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:13' shape=(None,) dtype=float32>, 'pickup_census_tract_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:7' shape=(None, 11) dtype=float32>, 'dropoff_longitude_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:4' shape=(None,) dtype=float32>, 'pickup_community_area_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:8' shape=(None, 66) dtype=float32>, 'trip_miles_xf': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:12' shape=(None,) dtype=float32>, 'tips': <tf.Tensor 'transform_features_layer/StatefulPartitionedCall:11' shape=(None,) dtype=int64>}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Assets written to: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model/6/Format-Serving/assets\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Training complete. Model written to /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model/6/Format-Serving. ModelRun written to /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model_run/6\n",
      "INFO:absl:Running publisher for Trainer\n",
      "INFO:absl:MetadataStore with DB connection initialized\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object expanded\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">ExecutionResult</span><span class=\"deemphasize\"> at 0x7fc9f38f34d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.execution_id</td><td class = \"attrvalue\">6</td></tr><tr><td class=\"attr-name\">.component</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Trainer</span><span class=\"deemphasize\"> at 0x7fc9fec3e710</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.inputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['examples']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Examples'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca45d81cd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Examples</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Examples'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transformed_examples/5)<span class=\"deemphasize\"> at 0x7fca8f861890</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Examples&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transformed_examples/5</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;eval&quot;, &quot;train&quot;]</td></tr><tr><td class=\"attr-name\">.version</td><td class = \"attrvalue\">0</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['transform_graph']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'TransformGraph'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca45d81fd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">TransformGraph</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'TransformGraph'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transform_graph/5)<span class=\"deemphasize\"> at 0x7fca8f857fd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.TransformGraph&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transform_graph/5</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['schema']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Schema'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e7d35d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Schema</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Schema'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3)<span class=\"deemphasize\"> at 0x7fca45729f10</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Schema&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.outputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['model']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Model'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fc9febd2490</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Model</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Model'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model/6)<span class=\"deemphasize\"> at 0x7fc9febd25d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Model&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model/6</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['model_run']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ModelRun'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fc9febd2350</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ModelRun</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ModelRun'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model_run/6)<span class=\"deemphasize\"> at 0x7fca1c33af10</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ModelRun&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model_run/6</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.exec_properties</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['train_args']</td><td class = \"attrvalue\">{\n",
       "  &quot;num_steps&quot;: 10000\n",
       "}</td></tr><tr><td class=\"attr-name\">['eval_args']</td><td class = \"attrvalue\">{\n",
       "  &quot;num_steps&quot;: 5000\n",
       "}</td></tr><tr><td class=\"attr-name\">['module_file']</td><td class = \"attrvalue\">None</td></tr><tr><td class=\"attr-name\">['run_fn']</td><td class = \"attrvalue\">None</td></tr><tr><td class=\"attr-name\">['trainer_fn']</td><td class = \"attrvalue\">None</td></tr><tr><td class=\"attr-name\">['custom_config']</td><td class = \"attrvalue\">null</td></tr><tr><td class=\"attr-name\">['module_path']</td><td class = \"attrvalue\">taxi_trainer@/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/_wheels/tfx_user_code_Trainer-0.0+b9709bb91d12b3ca961d7e09adb386fe9a4b2739bd1f503e449ed3ebdf707d78-py3-none-any.whl</td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">.component.inputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['examples']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Examples'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca45d81cd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Examples</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Examples'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transformed_examples/5)<span class=\"deemphasize\"> at 0x7fca8f861890</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Examples&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transformed_examples/5</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;eval&quot;, &quot;train&quot;]</td></tr><tr><td class=\"attr-name\">.version</td><td class = \"attrvalue\">0</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['transform_graph']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'TransformGraph'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca45d81fd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">TransformGraph</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'TransformGraph'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transform_graph/5)<span class=\"deemphasize\"> at 0x7fca8f857fd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.TransformGraph&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Transform/transform_graph/5</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['schema']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Schema'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1e7d35d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Schema</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Schema'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3)<span class=\"deemphasize\"> at 0x7fca45729f10</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Schema&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/SchemaGen/schema/3</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.component.outputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['model']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Model'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fc9febd2490</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Model</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Model'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model/6)<span class=\"deemphasize\"> at 0x7fc9febd25d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Model&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model/6</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['model_run']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ModelRun'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fc9febd2350</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ModelRun</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ModelRun'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model_run/6)<span class=\"deemphasize\"> at 0x7fca1c33af10</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ModelRun&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model_run/6</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr></table></div>"
      ],
      "text/plain": [
       "ExecutionResult(\n",
       "    component_id: Trainer\n",
       "    execution_id: 6\n",
       "    outputs:\n",
       "        model: OutputChannel(artifact_type=Model, producer_component_id=Trainer, output_key=model, additional_properties={}, additional_custom_properties={})\n",
       "        model_run: OutputChannel(artifact_type=ModelRun, producer_component_id=Trainer, output_key=model_run, additional_properties={}, additional_custom_properties={}))"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# TODO\n",
    "# use a TFX component to train a TensorFlow model\n",
    "trainer = tfx.components.Trainer(\n",
    "    module_file=os.path.abspath(_taxi_trainer_module_file),\n",
    "    examples=transform.outputs['transformed_examples'],\n",
    "    transform_graph=transform.outputs['transform_graph'],\n",
    "    schema=schema_gen.outputs['schema'],\n",
    "    train_args=tfx.proto.TrainArgs(num_steps=10000),\n",
    "    eval_args=tfx.proto.EvalArgs(num_steps=5000))\n",
    "context.run(trainer, enable_cache=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "6Cql1G35StJp"
   },
   "source": [
    "#### Analyze Training with TensorBoard\n",
    "Take a peek at the trainer artifact. It points to a directory containing the model subdirectories."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "id": "bXe62WE0S0Ek"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Format-Serving']\n",
      "['keras_metadata.pb', 'variables', 'saved_model.pb', 'assets']\n"
     ]
    }
   ],
   "source": [
    "model_artifact_dir = trainer.outputs['model'].get()[0].uri\n",
    "pp.pprint(os.listdir(model_artifact_dir))\n",
    "model_dir = os.path.join(model_artifact_dir, 'Format-Serving')\n",
    "pp.pprint(os.listdir(model_dir))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "DfjOmSro6Q3Y"
   },
   "source": [
    "Optionally, you can connect TensorBoard to the Trainer to analyze your model's training curves."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "id": "-APzqz2NeAyj"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "      <iframe id=\"tensorboard-frame-183d89e2dc831bd2\" width=\"100%\" height=\"800\" frameborder=\"0\">\n",
       "      </iframe>\n",
       "      <script>\n",
       "        (function() {\n",
       "          const frame = document.getElementById(\"tensorboard-frame-183d89e2dc831bd2\");\n",
       "          const url = new URL(\"/proxy/6006/\", window.location);\n",
       "          const port = 0;\n",
       "          if (port) {\n",
       "            url.port = port;\n",
       "          }\n",
       "          frame.src = url;\n",
       "        })();\n",
       "      </script>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model_run_artifact_dir = trainer.outputs['model_run'].get()[0].uri\n",
    "\n",
    "%load_ext tensorboard\n",
    "%tensorboard --logdir {model_run_artifact_dir}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "FmPftrv0lEQy"
   },
   "source": [
    "### Evaluator\n",
    "The `Evaluator` component computes model performance metrics over the evaluation set. It uses the [TensorFlow Model Analysis](https://www.tensorflow.org/tfx/model_analysis/get_started) library. The `Evaluator` can also optionally validate that a newly trained model is better than the previous model. This is useful in a production pipeline setting where you may automatically train and validate a model every day. In this notebook, you only train one model, so the `Evaluator` automatically will label the\n",
    "model as \"good\".\n",
    "\n",
    "`Evaluator` will take as input the data from `ExampleGen`, the trained model from `Trainer`, and slicing configuration. The slicing configuration allows you to slice your metrics on feature values (e.g. how does your model perform on taxi trips that start at 8am versus 8pm?). See an example of this configuration below:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "id": "fVhfzzh9PDEx"
   },
   "outputs": [],
   "source": [
    "# Imported files such as taxi_constants are normally cached, so changes are\n",
    "# not honored after the first import.  Normally this is good for efficiency, but\n",
    "# during development when you may be iterating code it can be a problem. To\n",
    "# avoid this problem during development, reload the file.\n",
    "import taxi_constants\n",
    "import sys\n",
    "if 'google.colab' in sys.modules:  # Testing to see if you're doing development\n",
    "  import importlib\n",
    "  importlib.reload(taxi_constants)\n",
    "\n",
    "eval_config = tfma.EvalConfig(\n",
    "    model_specs=[\n",
    "        # This assumes a serving model with signature 'serving_default'. If\n",
    "        # using estimator based EvalSavedModel, add signature_name: 'eval' and\n",
    "        # remove the label_key.\n",
    "        tfma.ModelSpec(\n",
    "            signature_name='serving_default',\n",
    "            label_key=taxi_constants.LABEL_KEY,\n",
    "            preprocessing_function_names=['transform_features'],\n",
    "            )\n",
    "        ],\n",
    "    metrics_specs=[\n",
    "        tfma.MetricsSpec(\n",
    "            # The metrics added here are in addition to those saved with the\n",
    "            # model (assuming either a keras model or EvalSavedModel is used).\n",
    "            # Any metrics added into the saved model (for example using\n",
    "            # model.compile(..., metrics=[...]), etc) will be computed\n",
    "            # automatically.\n",
    "            # To add validation thresholds for metrics saved with the model,\n",
    "            # add them keyed by metric name to the thresholds map.\n",
    "            metrics=[\n",
    "                tfma.MetricConfig(class_name='ExampleCount'),\n",
    "                tfma.MetricConfig(class_name='BinaryAccuracy',\n",
    "                  threshold=tfma.MetricThreshold(\n",
    "                      value_threshold=tfma.GenericValueThreshold(\n",
    "                          lower_bound={'value': 0.5}),\n",
    "                      # Change threshold will be ignored if there is no\n",
    "                      # baseline model resolved from MLMD (first run).\n",
    "                      change_threshold=tfma.GenericChangeThreshold(\n",
    "                          direction=tfma.MetricDirection.HIGHER_IS_BETTER,\n",
    "                          absolute={'value': -1e-10})))\n",
    "            ]\n",
    "        )\n",
    "    ],\n",
    "    slicing_specs=[\n",
    "        # An empty slice spec means the overall slice, i.e. the whole dataset.\n",
    "        tfma.SlicingSpec(),\n",
    "        # Data can be sliced along a feature column. In this case, data is\n",
    "        # sliced along feature column trip_start_hour.\n",
    "        tfma.SlicingSpec(\n",
    "            feature_keys=['trip_start_hour'])\n",
    "    ])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "9mBdKH1F8JuT"
   },
   "source": [
    "Next, you give this configuration to `Evaluator` and run it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "id": "Zjcx8g6mihSt"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Running driver for latest_blessed_model_resolver\n",
      "INFO:absl:MetadataStore with DB connection initialized\n",
      "INFO:absl:Running publisher for latest_blessed_model_resolver\n",
      "INFO:absl:MetadataStore with DB connection initialized\n",
      "INFO:absl:Running driver for Evaluator\n",
      "INFO:absl:MetadataStore with DB connection initialized\n",
      "INFO:absl:Running executor for Evaluator\n",
      "INFO:absl:Nonempty beam arg extra_packages already includes dependency\n",
      "INFO:absl:udf_utils.get_fn {'eval_config': '{\\n  \"metrics_specs\": [\\n    {\\n      \"metrics\": [\\n        {\\n          \"class_name\": \"ExampleCount\"\\n        },\\n        {\\n          \"class_name\": \"BinaryAccuracy\",\\n          \"threshold\": {\\n            \"change_threshold\": {\\n              \"absolute\": -1e-10,\\n              \"direction\": \"HIGHER_IS_BETTER\"\\n            },\\n            \"value_threshold\": {\\n              \"lower_bound\": 0.5\\n            }\\n          }\\n        }\\n      ]\\n    }\\n  ],\\n  \"model_specs\": [\\n    {\\n      \"label_key\": \"tips\",\\n      \"preprocessing_function_names\": [\\n        \"transform_features\"\\n      ],\\n      \"signature_name\": \"serving_default\"\\n    }\\n  ],\\n  \"slicing_specs\": [\\n    {},\\n    {\\n      \"feature_keys\": [\\n        \"trip_start_hour\"\\n      ]\\n    }\\n  ]\\n}', 'feature_slicing_spec': None, 'fairness_indicator_thresholds': 'null', 'example_splits': 'null', 'module_file': None, 'module_path': None} 'custom_eval_shared_model'\n",
      "INFO:absl:Request was made to ignore the baseline ModelSpec and any change thresholds. This is likely because a baseline model was not provided: updated_config=\n",
      "model_specs {\n",
      "  signature_name: \"serving_default\"\n",
      "  label_key: \"tips\"\n",
      "  preprocessing_function_names: \"transform_features\"\n",
      "}\n",
      "slicing_specs {\n",
      "}\n",
      "slicing_specs {\n",
      "  feature_keys: \"trip_start_hour\"\n",
      "}\n",
      "metrics_specs {\n",
      "  metrics {\n",
      "    class_name: \"ExampleCount\"\n",
      "  }\n",
      "  metrics {\n",
      "    class_name: \"BinaryAccuracy\"\n",
      "    threshold {\n",
      "      value_threshold {\n",
      "        lower_bound {\n",
      "          value: 0.5\n",
      "        }\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "}\n",
      "\n",
      "INFO:absl:Using /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model/6/Format-Serving as  model.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:Inconsistent references when loading the checkpoint into this object graph. For example, in the saved checkpoint object, `model.layer.weight` and `model.layer_copy.weight` reference the same variable, while in the current object these are two different variables. The referenced variables are:(<keras.saving.saved_model.load.TensorFlowTransform>TransformFeaturesLayer object at 0x7fc9f3c36f90> and <keras.engine.input_layer.InputLayer object at 0x7fc9f3e59d50>).\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:The 'example_splits' parameter is not set, using 'eval' split.\n",
      "INFO:absl:Evaluating model.\n",
      "INFO:absl:udf_utils.get_fn {'eval_config': '{\\n  \"metrics_specs\": [\\n    {\\n      \"metrics\": [\\n        {\\n          \"class_name\": \"ExampleCount\"\\n        },\\n        {\\n          \"class_name\": \"BinaryAccuracy\",\\n          \"threshold\": {\\n            \"change_threshold\": {\\n              \"absolute\": -1e-10,\\n              \"direction\": \"HIGHER_IS_BETTER\"\\n            },\\n            \"value_threshold\": {\\n              \"lower_bound\": 0.5\\n            }\\n          }\\n        }\\n      ]\\n    }\\n  ],\\n  \"model_specs\": [\\n    {\\n      \"label_key\": \"tips\",\\n      \"preprocessing_function_names\": [\\n        \"transform_features\"\\n      ],\\n      \"signature_name\": \"serving_default\"\\n    }\\n  ],\\n  \"slicing_specs\": [\\n    {},\\n    {\\n      \"feature_keys\": [\\n        \"trip_start_hour\"\\n      ]\\n    }\\n  ]\\n}', 'feature_slicing_spec': None, 'fairness_indicator_thresholds': 'null', 'example_splits': 'null', 'module_file': None, 'module_path': None} 'custom_extractors'\n",
      "INFO:absl:Request was made to ignore the baseline ModelSpec and any change thresholds. This is likely because a baseline model was not provided: updated_config=\n",
      "model_specs {\n",
      "  signature_name: \"serving_default\"\n",
      "  label_key: \"tips\"\n",
      "  preprocessing_function_names: \"transform_features\"\n",
      "}\n",
      "slicing_specs {\n",
      "}\n",
      "slicing_specs {\n",
      "  feature_keys: \"trip_start_hour\"\n",
      "}\n",
      "metrics_specs {\n",
      "  metrics {\n",
      "    class_name: \"ExampleCount\"\n",
      "  }\n",
      "  metrics {\n",
      "    class_name: \"BinaryAccuracy\"\n",
      "    threshold {\n",
      "      value_threshold {\n",
      "        lower_bound {\n",
      "          value: 0.5\n",
      "        }\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  model_names: \"\"\n",
      "}\n",
      "\n",
      "INFO:absl:Request was made to ignore the baseline ModelSpec and any change thresholds. This is likely because a baseline model was not provided: updated_config=\n",
      "model_specs {\n",
      "  signature_name: \"serving_default\"\n",
      "  label_key: \"tips\"\n",
      "  preprocessing_function_names: \"transform_features\"\n",
      "}\n",
      "slicing_specs {\n",
      "}\n",
      "slicing_specs {\n",
      "  feature_keys: \"trip_start_hour\"\n",
      "}\n",
      "metrics_specs {\n",
      "  metrics {\n",
      "    class_name: \"ExampleCount\"\n",
      "  }\n",
      "  metrics {\n",
      "    class_name: \"BinaryAccuracy\"\n",
      "    threshold {\n",
      "      value_threshold {\n",
      "        lower_bound {\n",
      "          value: 0.5\n",
      "        }\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  model_names: \"\"\n",
      "}\n",
      "\n",
      "INFO:absl:Request was made to ignore the baseline ModelSpec and any change thresholds. This is likely because a baseline model was not provided: updated_config=\n",
      "model_specs {\n",
      "  signature_name: \"serving_default\"\n",
      "  label_key: \"tips\"\n",
      "  preprocessing_function_names: \"transform_features\"\n",
      "}\n",
      "slicing_specs {\n",
      "}\n",
      "slicing_specs {\n",
      "  feature_keys: \"trip_start_hour\"\n",
      "}\n",
      "metrics_specs {\n",
      "  metrics {\n",
      "    class_name: \"ExampleCount\"\n",
      "  }\n",
      "  metrics {\n",
      "    class_name: \"BinaryAccuracy\"\n",
      "    threshold {\n",
      "      value_threshold {\n",
      "        lower_bound {\n",
      "          value: 0.5\n",
      "        }\n",
      "      }\n",
      "    }\n",
      "  }\n",
      "  model_names: \"\"\n",
      "}\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:Inconsistent references when loading the checkpoint into this object graph. For example, in the saved checkpoint object, `model.layer.weight` and `model.layer_copy.weight` reference the same variable, while in the current object these are two different variables. The referenced variables are:(<keras.saving.saved_model.load.TensorFlowTransform>TransformFeaturesLayer object at 0x7fc9f0879d50> and <keras.engine.input_layer.InputLayer object at 0x7fc9fd94cf10>).\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:Inconsistent references when loading the checkpoint into this object graph. For example, in the saved checkpoint object, `model.layer.weight` and `model.layer_copy.weight` reference the same variable, while in the current object these are two different variables. The referenced variables are:(<keras.saving.saved_model.load.TensorFlowTransform>TransformFeaturesLayer object at 0x7fc9f0f4edd0> and <keras.engine.input_layer.InputLayer object at 0x7fc9f06d6f90>).\n",
      "WARNING:tensorflow:Inconsistent references when loading the checkpoint into this object graph. For example, in the saved checkpoint object, `model.layer.weight` and `model.layer_copy.weight` reference the same variable, while in the current object these are two different variables. The referenced variables are:(<keras.saving.saved_model.load.TensorFlowTransform>TransformFeaturesLayer object at 0x7fc9f109add0> and <keras.engine.input_layer.InputLayer object at 0x7fc9f245f590>).\n",
      "WARNING:tensorflow:Inconsistent references when loading the checkpoint into this object graph. For example, in the saved checkpoint object, `model.layer.weight` and `model.layer_copy.weight` reference the same variable, while in the current object these are two different variables. The referenced variables are:(<keras.saving.saved_model.load.TensorFlowTransform>TransformFeaturesLayer object at 0x7fca1c434790> and <keras.engine.input_layer.InputLayer object at 0x7fc9f2628a90>).\n",
      "WARNING:tensorflow:Inconsistent references when loading the checkpoint into this object graph. For example, in the saved checkpoint object, `model.layer.weight` and `model.layer_copy.weight` reference the same variable, while in the current object these are two different variables. The referenced variables are:(<keras.saving.saved_model.load.TensorFlowTransform>TransformFeaturesLayer object at 0x7fca45c2bad0> and <keras.engine.input_layer.InputLayer object at 0x7fc9fe5bbb90>).\n",
      "WARNING:tensorflow:Inconsistent references when loading the checkpoint into this object graph. For example, in the saved checkpoint object, `model.layer.weight` and `model.layer_copy.weight` reference the same variable, while in the current object these are two different variables. The referenced variables are:(<keras.saving.saved_model.load.TensorFlowTransform>TransformFeaturesLayer object at 0x7fc9f274fa50> and <keras.engine.input_layer.InputLayer object at 0x7fc9f2221790>).\n",
      "WARNING:tensorflow:Inconsistent references when loading the checkpoint into this object graph. For example, in the saved checkpoint object, `model.layer.weight` and `model.layer_copy.weight` reference the same variable, while in the current object these are two different variables. The referenced variables are:(<keras.saving.saved_model.load.TensorFlowTransform>TransformFeaturesLayer object at 0x7fc9f06bb490> and <keras.engine.input_layer.InputLayer object at 0x7fc9f0693950>).\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Evaluation complete. Results written to /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Evaluator/evaluation/8.\n",
      "INFO:absl:Checking validation results.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:109: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use eager execution and: \n",
      "`tf.data.TFRecordDataset(path)`\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Blessing result True written to /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Evaluator/blessing/8.\n",
      "INFO:absl:Running publisher for Evaluator\n",
      "INFO:absl:MetadataStore with DB connection initialized\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object expanded\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">ExecutionResult</span><span class=\"deemphasize\"> at 0x7fca45ccd6d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.execution_id</td><td class = \"attrvalue\">8</td></tr><tr><td class=\"attr-name\">.component</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Evaluator</span><span class=\"deemphasize\"> at 0x7fc9f3ee9090</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.inputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['examples']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Examples'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1eaa3ad0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Examples</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Examples'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1)<span class=\"deemphasize\"> at 0x7fca1ea89c90</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Examples&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;train&quot;, &quot;eval&quot;]</td></tr><tr><td class=\"attr-name\">.version</td><td class = \"attrvalue\">0</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['model']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Model'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fc9febd2490</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Model</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Model'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model/6)<span class=\"deemphasize\"> at 0x7fc9febd25d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Model&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model/6</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['baseline_model']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Model'</span> (0 artifacts)<span class=\"deemphasize\"> at 0x7fc9f08eccd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Model</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\">[]</td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.outputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['evaluation']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ModelEvaluation'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fc9f08f1a50</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ModelEvaluation</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ModelEvaluation'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Evaluator/evaluation/8)<span class=\"deemphasize\"> at 0x7fc9f3ea7290</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ModelEvaluation&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Evaluator/evaluation/8</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['blessing']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ModelBlessing'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fc9f08f1110</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ModelBlessing</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ModelBlessing'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Evaluator/blessing/8)<span class=\"deemphasize\"> at 0x7fc9f3ea7390</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ModelBlessing&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Evaluator/blessing/8</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.exec_properties</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['eval_config']</td><td class = \"attrvalue\">{\n",
       "  &quot;metrics_specs&quot;: [\n",
       "    {\n",
       "      &quot;metrics&quot;: [\n",
       "        {\n",
       "          &quot;class_name&quot;: &quot;ExampleCount&quot;\n",
       "        },\n",
       "        {\n",
       "          &quot;class_name&quot;: &quot;BinaryAccuracy&quot;,\n",
       "          &quot;threshold&quot;: {\n",
       "            &quot;change_threshold&quot;: {\n",
       "              &quot;absolute&quot;: -1e-10,\n",
       "              &quot;direction&quot;: &quot;HIGHER_IS_BETTER&quot;\n",
       "            },\n",
       "            &quot;value_threshold&quot;: {\n",
       "              &quot;lower_bound&quot;: 0.5\n",
       "            }\n",
       "          }\n",
       "        }\n",
       "      ]\n",
       "    }\n",
       "  ],\n",
       "  &quot;model_specs&quot;: [\n",
       "    {\n",
       "      &quot;label_key&quot;: &quot;tips&quot;,\n",
       "      &quot;preprocessing_function_names&quot;: [\n",
       "        &quot;transform_features&quot;\n",
       "      ],\n",
       "      &quot;signature_name&quot;: &quot;serving_default&quot;\n",
       "    }\n",
       "  ],\n",
       "  &quot;slicing_specs&quot;: [\n",
       "    {},\n",
       "    {\n",
       "      &quot;feature_keys&quot;: [\n",
       "        &quot;trip_start_hour&quot;\n",
       "      ]\n",
       "    }\n",
       "  ]\n",
       "}</td></tr><tr><td class=\"attr-name\">['feature_slicing_spec']</td><td class = \"attrvalue\">None</td></tr><tr><td class=\"attr-name\">['fairness_indicator_thresholds']</td><td class = \"attrvalue\">null</td></tr><tr><td class=\"attr-name\">['example_splits']</td><td class = \"attrvalue\">null</td></tr><tr><td class=\"attr-name\">['module_file']</td><td class = \"attrvalue\">None</td></tr><tr><td class=\"attr-name\">['module_path']</td><td class = \"attrvalue\">None</td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">.component.inputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['examples']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Examples'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fca1eaa3ad0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Examples</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Examples'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1)<span class=\"deemphasize\"> at 0x7fca1ea89c90</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Examples&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/CsvExampleGen/examples/1</td></tr><tr><td class=\"attr-name\">.span</td><td class = \"attrvalue\">0</td></tr><tr><td class=\"attr-name\">.split_names</td><td class = \"attrvalue\">[&quot;train&quot;, &quot;eval&quot;]</td></tr><tr><td class=\"attr-name\">.version</td><td class = \"attrvalue\">0</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['model']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Model'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fc9febd2490</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Model</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Model'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model/6)<span class=\"deemphasize\"> at 0x7fc9febd25d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Model&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model/6</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['baseline_model']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Model'</span> (0 artifacts)<span class=\"deemphasize\"> at 0x7fc9f08eccd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Model</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\">[]</td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.component.outputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['evaluation']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ModelEvaluation'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fc9f08f1a50</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ModelEvaluation</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ModelEvaluation'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Evaluator/evaluation/8)<span class=\"deemphasize\"> at 0x7fc9f3ea7290</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ModelEvaluation&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Evaluator/evaluation/8</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['blessing']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ModelBlessing'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fc9f08f1110</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ModelBlessing</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ModelBlessing'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Evaluator/blessing/8)<span class=\"deemphasize\"> at 0x7fc9f3ea7390</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ModelBlessing&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Evaluator/blessing/8</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr></table></div>"
      ],
      "text/plain": [
       "ExecutionResult(\n",
       "    component_id: Evaluator\n",
       "    execution_id: 8\n",
       "    outputs:\n",
       "        evaluation: OutputChannel(artifact_type=ModelEvaluation, producer_component_id=Evaluator, output_key=evaluation, additional_properties={}, additional_custom_properties={})\n",
       "        blessing: OutputChannel(artifact_type=ModelBlessing, producer_component_id=Evaluator, output_key=blessing, additional_properties={}, additional_custom_properties={}))"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Use TFMA to compute a evaluation statistics over features of a model and\n",
    "# validate them against a baseline.\n",
    "\n",
    "# The model resolver is only required if performing model validation in addition\n",
    "# to evaluation. In this case you validate against the latest blessed model. If\n",
    "# no model has been blessed before (as in this case) the evaluator will make your\n",
    "# candidate the first blessed model.\n",
    "model_resolver = tfx.dsl.Resolver(\n",
    "      strategy_class=tfx.dsl.experimental.LatestBlessedModelStrategy,\n",
    "      model=tfx.dsl.Channel(type=tfx.types.standard_artifacts.Model),\n",
    "      model_blessing=tfx.dsl.Channel(\n",
    "          type=tfx.types.standard_artifacts.ModelBlessing)).with_id(\n",
    "              'latest_blessed_model_resolver')\n",
    "context.run(model_resolver, enable_cache=True)\n",
    "\n",
    "evaluator = tfx.components.Evaluator(\n",
    "    examples=example_gen.outputs['examples'],\n",
    "    model=trainer.outputs['model'],\n",
    "    baseline_model=model_resolver.outputs['model'],\n",
    "    eval_config=eval_config)\n",
    "context.run(evaluator, enable_cache=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "AeCVkBusS_8g"
   },
   "source": [
    "Now let's examine the output artifacts of `Evaluator`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "id": "k4GghePOTJxL"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'evaluation': OutputChannel(artifact_type=ModelEvaluation, producer_component_id=Evaluator, output_key=evaluation, additional_properties={}, additional_custom_properties={}),\n",
       " 'blessing': OutputChannel(artifact_type=ModelBlessing, producer_component_id=Evaluator, output_key=blessing, additional_properties={}, additional_custom_properties={})}"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evaluator.outputs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Y5TMskWe9LL0"
   },
   "source": [
    "Using the `evaluation` output you can show the default visualization of global metrics on the entire evaluation set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "id": "U729j5X5QQUQ"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<b>Artifact at /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Evaluator/evaluation/8</b><br/><br/>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "context.show(evaluator.outputs['evaluation'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "t-tI4p6m-OAn"
   },
   "source": [
    "To see the visualization for sliced evaluation metrics, you can directly call the TensorFlow Model Analysis library."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "id": "pyis6iy0HLdi"
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "4958ef09be574764954681235216239a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_hour:19',…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import tensorflow_model_analysis as tfma\n",
    "\n",
    "# Get the TFMA output result path and load the result.\n",
    "PATH_TO_RESULT = evaluator.outputs['evaluation'].get()[0].uri\n",
    "tfma_result = tfma.load_eval_result(PATH_TO_RESULT)\n",
    "\n",
    "# Show data sliced along feature column trip_start_hour.\n",
    "tfma.view.render_slicing_metrics(\n",
    "    tfma_result, slicing_column='trip_start_hour')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "7uvYrUf2-r_6"
   },
   "source": [
    "This visualization shows the same metrics, but computed at every feature value of `trip_start_hour` instead of on the entire evaluation set.\n",
    "\n",
    "TensorFlow Model Analysis supports many other visualizations, such as Fairness Indicators and plotting a time series of model performance. To learn more, see [the tutorial](https://www.tensorflow.org/tfx/tutorials/model_analysis/tfma_basic)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "TEotnkxEswUb"
   },
   "source": [
    "Since you added thresholds to your config, validation output is also available. The precence of a `blessing` artifact indicates that your model passed validation. Since this is the first validation being performed the candidate is automatically blessed."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "id": "FZmiRtg6TKtR"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total 0\n",
      "-rw-r--r-- 1 jupyter jupyter 0 May 12 18:24 BLESSED\n"
     ]
    }
   ],
   "source": [
    "blessing_uri = evaluator.outputs['blessing'].get()[0].uri\n",
    "!ls -l {blessing_uri}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "hM1tFkOVSBa0"
   },
   "source": [
    "Now can also verify the success by loading the validation result record:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "id": "lxa5G08bSJ8a"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "validation_ok: true\n",
      "validation_details {\n",
      "  slicing_details {\n",
      "    slicing_spec {\n",
      "    }\n",
      "    num_matching_slices: 25\n",
      "  }\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "PATH_TO_RESULT = evaluator.outputs['evaluation'].get()[0].uri\n",
    "print(tfma.load_validation_result(PATH_TO_RESULT))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "T8DYekCZlHfj"
   },
   "source": [
    "### Pusher\n",
    "The `Pusher` component is usually at the end of a TFX pipeline. It checks whether a model has passed validation, and if so, exports the model to `_serving_model_dir`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "id": "r45nQ69eikc9"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:absl:Running driver for Pusher\n",
      "INFO:absl:MetadataStore with DB connection initialized\n",
      "INFO:absl:Running executor for Pusher\n",
      "INFO:absl:Model version: 1652379940\n",
      "INFO:absl:Model written to serving path /tmp/tmp0v237sow/serving_model/taxi_simple/1652379940.\n",
      "INFO:absl:Model pushed to /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Pusher/pushed_model/9.\n",
      "INFO:absl:Running publisher for Pusher\n",
      "INFO:absl:MetadataStore with DB connection initialized\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object expanded\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">ExecutionResult</span><span class=\"deemphasize\"> at 0x7fc9f08b5d90</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.execution_id</td><td class = \"attrvalue\">9</td></tr><tr><td class=\"attr-name\">.component</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Pusher</span><span class=\"deemphasize\"> at 0x7fc9d7bd3dd0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.inputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['model']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Model'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fc9febd2490</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Model</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Model'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model/6)<span class=\"deemphasize\"> at 0x7fc9febd25d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Model&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model/6</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['model_blessing']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ModelBlessing'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fc9f08f1110</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ModelBlessing</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ModelBlessing'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Evaluator/blessing/8)<span class=\"deemphasize\"> at 0x7fc9f3ea7390</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ModelBlessing&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Evaluator/blessing/8</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.outputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['pushed_model']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'PushedModel'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fc9d7bd3f90</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">PushedModel</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'PushedModel'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Pusher/pushed_model/9)<span class=\"deemphasize\"> at 0x7fc9d7bd35d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.PushedModel&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Pusher/pushed_model/9</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.exec_properties</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['push_destination']</td><td class = \"attrvalue\">{\n",
       "  &quot;filesystem&quot;: {\n",
       "    &quot;base_directory&quot;: &quot;/tmp/tmp0v237sow/serving_model/taxi_simple&quot;\n",
       "  }\n",
       "}</td></tr><tr><td class=\"attr-name\">['custom_config']</td><td class = \"attrvalue\">null</td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">.component.inputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['model']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'Model'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fc9febd2490</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">Model</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'Model'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model/6)<span class=\"deemphasize\"> at 0x7fc9febd25d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.Model&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Trainer/model/6</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr><tr><td class=\"attr-name\">['model_blessing']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'ModelBlessing'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fc9f08f1110</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">ModelBlessing</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'ModelBlessing'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Evaluator/blessing/8)<span class=\"deemphasize\"> at 0x7fc9f3ea7390</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.ModelBlessing&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Evaluator/blessing/8</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td class=\"attr-name\">.component.outputs</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">['pushed_model']</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Channel</span> of type <span class=\"class-name\">'PushedModel'</span> (1 artifact)<span class=\"deemphasize\"> at 0x7fc9d7bd3f90</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type_name</td><td class = \"attrvalue\">PushedModel</td></tr><tr><td class=\"attr-name\">._artifacts</td><td class = \"attrvalue\"><table class=\"attr-table\"><tr><td class=\"attr-name\">[0]</td><td class = \"attrvalue\"><style>\n",
       ".tfx-object.expanded {\n",
       "  padding: 4px 8px 4px 8px;\n",
       "  background: white;\n",
       "  border: 1px solid #bbbbbb;\n",
       "  box-shadow: 4px 4px 2px rgba(0,0,0,0.05);\n",
       "}\n",
       ".tfx-object, .tfx-object * {\n",
       "  font-size: 11pt;\n",
       "}\n",
       ".tfx-object > .title {\n",
       "  cursor: pointer;\n",
       "}\n",
       ".tfx-object .expansion-marker {\n",
       "  color: #999999;\n",
       "}\n",
       ".tfx-object.expanded > .title > .expansion-marker:before {\n",
       "  content: '▼';\n",
       "}\n",
       ".tfx-object.collapsed > .title > .expansion-marker:before {\n",
       "  content: '▶';\n",
       "}\n",
       ".tfx-object .class-name {\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object .deemphasize {\n",
       "  opacity: 0.5;\n",
       "}\n",
       ".tfx-object.collapsed > table.attr-table {\n",
       "  display: none;\n",
       "}\n",
       ".tfx-object.expanded > table.attr-table {\n",
       "  display: block;\n",
       "}\n",
       ".tfx-object table.attr-table {\n",
       "  border: 2px solid white;\n",
       "  margin-top: 5px;\n",
       "}\n",
       ".tfx-object table.attr-table td.attr-name {\n",
       "  vertical-align: top;\n",
       "  font-weight: bold;\n",
       "}\n",
       ".tfx-object table.attr-table td.attrvalue {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<script>\n",
       "function toggleTfxObject(element) {\n",
       "  var objElement = element.parentElement;\n",
       "  if (objElement.classList.contains('collapsed')) {\n",
       "    objElement.classList.remove('collapsed');\n",
       "    objElement.classList.add('expanded');\n",
       "  } else {\n",
       "    objElement.classList.add('collapsed');\n",
       "    objElement.classList.remove('expanded');\n",
       "  }\n",
       "}\n",
       "</script>\n",
       "<div class=\"tfx-object collapsed\"><div class = \"title\" onclick=\"toggleTfxObject(this)\"><span class=\"expansion-marker\"></span><span class=\"class-name\">Artifact</span> of type <span class=\"class-name\">'PushedModel'</span> (uri: /tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Pusher/pushed_model/9)<span class=\"deemphasize\"> at 0x7fc9d7bd35d0</span></div><table class=\"attr-table\"><tr><td class=\"attr-name\">.type</td><td class = \"attrvalue\">&lt;class &#x27;tfx.types.standard_artifacts.PushedModel&#x27;&gt;</td></tr><tr><td class=\"attr-name\">.uri</td><td class = \"attrvalue\">/tmp/tfx-interactive-2022-05-12T18_19_36.643039-dvoqyoju/Pusher/pushed_model/9</td></tr></table></div></td></tr></table></td></tr></table></div></td></tr></table></td></tr></table></div>"
      ],
      "text/plain": [
       "ExecutionResult(\n",
       "    component_id: Pusher\n",
       "    execution_id: 9\n",
       "    outputs:\n",
       "        pushed_model: OutputChannel(artifact_type=PushedModel, producer_component_id=Pusher, output_key=pushed_model, additional_properties={}, additional_custom_properties={}))"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pusher = tfx.components.Pusher(\n",
    "    model=trainer.outputs['model'],\n",
    "    model_blessing=evaluator.outputs['blessing'],\n",
    "    push_destination=tfx.proto.PushDestination(\n",
    "        filesystem=tfx.proto.PushDestination.Filesystem(\n",
    "            base_directory=_serving_model_dir)))\n",
    "context.run(pusher, enable_cache=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ctUErBYoTO9I"
   },
   "source": [
    "Let's examine the output artifacts of `Pusher`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "id": "pRkWo-MzTSss"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'pushed_model': OutputChannel(artifact_type=PushedModel, producer_component_id=Pusher, output_key=pushed_model, additional_properties={}, additional_custom_properties={})}"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pusher.outputs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "peH2PPS3VgkL"
   },
   "source": [
    "In particular, the Pusher will export your model in the SavedModel format, which looks like this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "id": "4zyIqWl9TSdG"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('serving_default',\n",
      " <ConcreteFunction signature_wrapper(*, examples) at 0x7FC9D79F4E90>)\n",
      "('transform_features',\n",
      " <ConcreteFunction signature_wrapper(*, examples) at 0x7FC9D78F2CD0>)\n"
     ]
    }
   ],
   "source": [
    "push_uri = pusher.outputs['pushed_model'].get()[0].uri\n",
    "model = tf.saved_model.load(push_uri)\n",
    "\n",
    "for item in model.signatures.items():\n",
    "  pp.pprint(item)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "3-YPNUuHANtj"
   },
   "source": [
    "You're finished your tour of built-in TFX components!"
   ]
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "collapsed_sections": [
    "wdeKOEkv1Fe8"
   ],
   "name": "components_keras.ipynb",
   "private_outputs": true,
   "provenance": [],
   "toc_visible": true
  },
  "environment": {
   "kernel": "python3",
   "name": "tf2-gpu.2-6.m91",
   "type": "gcloud",
   "uri": "gcr.io/deeplearning-platform-release/tf2-gpu.2-6:m91"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
